Java反射
参考《Java安全漫谈》
概念
反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行状态的时候才动态加载类,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的方法/访问属性。这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。通过使用反射我们不仅可以获取到任何类的成员方法(Methods)、成员变量(Fields)、构造方法(Constructors)等信息,还可以动态创建Java类实例、调用任意的类方法、修改任意的类成员变量值等。
java反射机制组成需要重点注意一下的类:
- java.lang.Class :类对象
- java.lang.reflect.Constructor 类构造器对象
-
java.lang.reflect.Field
:类的属性对象; -
java.lang.reflect.Method 类方法对象
Class类
在程序运行期间,Java运行时系统始终为所有对象维护一个运行时类型标识。这个信息会跟踪每个对象所属的类。虚拟机利用运行时类型信息选择要执行的正确方法。
可以使用一个特殊的Java类访问这些信息。保存这些信息的类名为Class
。
能得到Class类,也就是 java.lang.class对象 的三种方法:
- .class 在加载了某个类的时候,可以直接获取他的属性,如:
System.out.println(cla.class);
- obj.getClass() 如果存在了某个 obj实例,那么可以通过getClass()方法得到这个类对应的class例如:
System.out.println(cla.getClass());
- Class.forName ,也是最常用的,知道了哪个类的完整包名或类名后,可以作为参数:
Class<?> cla = Class.forName("a.cat"); //包名下的cat类
System.out.println(Class.forName("a.cat&