引言
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
示例
public class TestFanshe {
public static void main(String[] arg) throws Exception {
Class cls = Class.forName("com.test.application.javatest.Teacher");
//get all contructors
for (int i = 0; i < cls.getConstructors().length; i++) {
System.out.println("constuctor " + i + " :" + cls.getConstructors()[i]);
}
//获取到构造方法
Constructor constructor = cls.getConstructor(String.class, String.class); //获取某一个构造方法
constructor.setAccessible(true); //暴力反射
//获取对象
Object object = constructor.newInstance("wangyu", "24");
//获取所有方法
Method method1 = cls.getDeclaredMethod("setName", String.class);
method1.setAccessible(true);
method1.invoke(object, "wangdada");
//获取所有无参方法
Method method2 = cls.getDeclaredMethod("print");
method2.setAccessible(true);
method2.invoke(object);
//获取所有参数
Field field = cls.getDeclaredField("name");
field.setAccessible(true);
String name = (String) field.get(object);
System.out.println("得到的name:" + name);
//反射main函数
Class clzz = Class.forName("com.test.application.javatest.NewMai");
Constructor con = clzz.getConstructor();
Object main = con.newInstance();
//获取特定的方法
Method methodMain = clzz.getMethod("main", String[].class);
methodMain.invoke(main, (Object) new String[]{"1", "2", "3"});
}
}