关于反射的使用教程很多,这里就不介绍了,因为平时用的实在不多,所以主要记录一下整体常用的过程以备之后查找。
使用反射的时候有几个类比较重要,分别是 Class「类的类型信息」、Constructor「构造器」、Method「方法」和 Field「属性」。在 Class 类中保存着类的所有信息,猜测其实Class类是对字节码文件解析后保存的结果,其中自然有对应类的所有信息,而其他的三个类则对应着类中的构造器、方法和属性,可以通过Class类的对应方法(如:class.getConstructors()
等)来获取。
通过构造器类,我们可以创建这个对象(如:constructor.newInstance(Object... initargs)
);
通过方法类,我们可以获取方法,并且调用方法(如:method.invoke(Object obj, Object... args)
),其中第一个参数obj为要执行此方法的对象,一般情况下为之前的构造器类创建的对象,第二个参数为调用的方法的参数;
通过属性类,可以获取类的所有属性。
当然,实际的功能方法远远不止这些,这里就不一一列举了。
实际使用时,最简单的使用情况为:
-
通过类的全限定名获取类的Class对象。
-
通过Class对象获取它的构造器对象和方法对象等。
-
通过构造器对象创建类的实例。
-
调用对应方法对象的
invoke(Object obj, Object... args)
方法,传入构造器创建的实例和方法所需参数。 -
获取方法执行后的结果,根据需要进行强制类型转换。
下面列举一个简单例子供大家参考:
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"; } }