反射机制
一:什么是反射机制
- 反射机制就是可以操作字节码文件的一种手段(class文件)
- 反射是通过对象获得其class对象的方法
- 反射机制相关的重要的类如下:
- java.lang.Class:代表整个字节码,代表一个类
- java.lang.reflect.Method:代表字节码中的方法字节码
- java.lang.reflect.Constructor:代表字节码中的构造方法字节码
- java.lang.reflect.Field:代表字节码中的属性字段字节码
二:Class对象
我们对class对象操作前必须先获得其Class对象;获取一个类的Class对象有三种方式:
-
任何一个类都有其Class属性,直接调用类名.Class属性获取其Class对象
-
任何一个对象都有其==getClass()==方法,调用其方法也可以获得Class对象
-
静态方法==Class.forName("")==方法,传入一个对象的完整类名(包括包名)
注意: 当我们调用静态方法Class.forName("")时,会导致类被加载,类一加载,那么静态代码块就执行,所以当我们希望一个类只有静态代码块被执行可以使用此方法
//1.得到某个类的class对象的三种方法 @Test public void test() throws ClassNotFoundException { Class c1 = Student.class; System.out.println("c1 = " + c1); //1.c1 = class com.zelin.test.pojo.Student Class c2 = new Student().getClass(); System.out.println("c2 = " + c2); //2.c2 = class com.zelin.test.pojo.Student Class c3 = Class.forName("com.zelin.test.pojo.Student"); System.out.println("c3 = " + c3); //3.c3 = class com.zelin.test.pojo.Student }
三:Constructor构造方法
我们知道:构造方法包含权限修饰符,构造方法的参数列表
-
首先获取Class对象内所有的构造方法,以及其访问权限和参数列表
//2.1) 先获取class对象 Class c = Class.forName("com.zelin.test.pojo.Student"); //2.8) 获取所有构造方法的数组 Constructor[] d = c.getDeclaredConstructors(); System.out.println(d.length); //2.8) 打印构造器信息 for (Constructor con : d) { //2.8.1) 获取构造器对象名称 String name = con.getName(); //2.8.2) 获取对象参数类型 String s = Modifier.toString(con.getModifiers()); //2.8) 打印构造器信息 for (Constructor con : d) { //2.8.1) 获取构造器对象名称 String name = con.getName(); //2.8.2) 获取对象参数类型 String s = Modifier.toString(con.getModifiers()); System.out.println(s+" "+"class "+" "+name + "(" + ")" + "{\n}"); }