Published on

JAVA 反射应用

Authors

什么是反射?

最简单的理解,可以将"ClassName"转换成一个真正的对象。可以动态的调用某个函数,创建某个类。 像python,php这种动态语言很容易实现,java就需要借助反射。

例子读取spring.txt中的字段,实例化类,调用方法

示例代码:

  • test类
package com.hellomaven;


import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Properties;

public class TestService {
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void main(String[] args) throws Exception {

        File springConfigFile = new File("./src/main/java/com/hellomaven/spring.txt");

        //获取配置
        Properties springConfig = new Properties();
        springConfig.load(new FileInputStream(springConfigFile));
        String className = (String)springConfig.get("class");
        String methodName = (String)springConfig.get("method");

        //得到类类型
        Class clazz = Class.forName(className);
        //得到方法
        Method m = clazz.getMethod(methodName);
        //得到构造函数
        Constructor c = clazz.getConstructor();
        //构造一个实例,所有实例都继承自Object
        Object service = c.newInstance();
        //调用方法。
        m.invoke(service);
    }
}
  • Hero类
package com.hellomaven;

public class Hero {
    public static void main(String []args){
        System.out.println("hello");
    }

    public String name;
    double hp;
    double mp;

    static String copyright;
    static {
        System.out.println("初始化 copyright");
        copyright = "版权由xxx公司所有";
    }

    public void Say(String words){
        System.out.println(words);
    }

    public void UseQ(){
        System.out.println("use q");
    }

    public void UseW(){
        System.out.println("use w");
    }
}
  • spring.txt文件
class=com.hellomaven.Hero
method=UseQ