Java反射机制
背景知识
- Class类(反射机制实现的基础)
Java中的Class的类是一个特殊的类,JVM加载字节码文件的时候,在方法区中为每一个类创建一个对应的Class类对象,这个对象中包含类的信息:方法,字段,注解等。
是什么
可以在运行时动态的获取类的信息。(比如:类里面定义的方法,字段,注解等信息)
有什么用
可以提高程序的可扩展性,以前没新增加一个类就需要修改原来的程序,以兼容新的类,现在只需要通过反射就能够获取到新增的自定义类信息,不需要每次修改原来的程序。
编程实例,代码中会包含以下几个部分的实现。
- 如何获取类的信息(三种方法)
- 如何通过构造函数串参数
- 如何获取到一个指定的函数,并执行
首先,先定义一个用于反射的类
package priv.darrenqiao.reflection; /* * @Author : darrenqiao * */ public class ReflectionClass { public String name; public Integer age; private String result; public void testName() { } public ReflectionClass(String result) { super(); this.result = result; } public void show(String test) { System.out.println("show result " + this.result + " and " + test); } public void testAge() { } }
然后我们通过main方法类进行反射机制的实现package priv.darrenqiao.reflection;
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* * @Author : darrenqiao * */ public class Main { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
//获取类方法一 ReflectionClass reflection = new ReflectionClass("success"); Class<?> classInfoForReflection = reflection.getClass(); //获取类方法二 //Class<ReflectionClass> classInfoForReflection = ReflectionClass.class; //获取类方法三,比较常用的是这种,因为后面的类全路径可以作为配置项放到配置文件中动态的获取 //Class<?> classInfoForReflection = Class.forName("priv.darrenqiao.reflection.ReflectionClass"); Method[] methods = classInfoForReflection.getMethods(); System.out.println("methods for class classInfoForReflection is"); for (Method m : methods) { System.out.println(m.getName()); } //通过构造函数传参数 Class<ReflectionClass> classInfoForReflectionClass = ReflectionClass.class; Constructor<?> c = classInfoForReflectionClass.getConstructor(String.class);
Object reflectionObject = (Object) c.newInstance("failed"); //执行指定函数 Method method = classInfoForReflectionClass.getMethod("show", String.class); method.invoke(reflectionObject, "test final"); } }