Java反射笔记

关于反射的使用教程很多,这里就不介绍了,因为平时用的实在不多,所以主要记录一下整体常用的过程以备之后查找。

使用反射的时候有几个类比较重要,分别是 Class「类的类型信息」、Constructor「构造器」、Method「方法」和 Field「属性」。在 Class 类中保存着类的所有信息,猜测其实Class类是对字节码文件解析后保存的结果,其中自然有对应类的所有信息,而其他的三个类则对应着类中的构造器、方法和属性,可以通过Class类的对应方法(如:class.getConstructors()等)来获取。

通过构造器类,我们可以创建这个对象(如:constructor.newInstance(Object... initargs));

通过方法类,我们可以获取方法,并且调用方法(如:method.invoke(Object obj, Object... args)),其中第一个参数obj为要执行此方法的对象,一般情况下为之前的构造器类创建的对象,第二个参数为调用的方法的参数;

通过属性类,可以获取类的所有属性。

当然,实际的功能方法远远不止这些,这里就不一一列举了。

实际使用时,最简单的使用情况为:

  1. 通过类的全限定名获取类的Class对象。

  2. 通过Class对象获取它的构造器对象和方法对象等。

  3. 通过构造器对象创建类的实例。

  4. 调用对应方法对象的invoke(Object obj, Object... args)方法,传入构造器创建的实例和方法所需参数。

  5. 获取方法执行后的结果,根据需要进行强制类型转换。

下面列举一个简单例子供大家参考:

package com.reflect;
​
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
​
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        String className = "com.reflect.MyTest";
​
        Class<?> clz = Class.forName(className);
        Constructor<?> constructor = clz.getConstructor();
        Method method = clz.getDeclaredMethod("test");
​
        Object instance = constructor.newInstance();
        String result = (String) method.invoke(instance);
        System.out.println(result);
    }
}

对应的测试的类代码为:

package com.reflect;
​
public class MyTest {
    public String test() {
        return "Hello, This is Test";
    }
}
原文地址:https://www.cnblogs.com/zawier/p/6713736.html