反射:
JAVA语言的反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
如何解剖一个类:
要想解剖一个类,必须先要获取到该类的字节码文件对象。
而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
通俗的来说:
反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
Person p = new Person();
p.使用
要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。
Class类:
成员变量 Field
构造方法 Constructor
成员方法 Method
获取Class文件对象的方式:
1: Person p = new Person();
Class c = p.getClass();
2:Class c2 = Person.class;
任意数据类型都具备一个class静态属性,看上去要比第一种方式简单.
3:将类名作为字符串传递给Class类中的静态方法forName即可
Class c3 = Class.forName("Person");
第三种和前两种的区别
前两种你必须明确Person类型.
后面是你我这种类型的字符串就行.这种扩展更强.我不需要知道你的类.我只提供字符串,按照配置文件加载就可以了
一般我们到底使用谁呢?
A:自己玩 任选一种,第二种比较方便
B:开发 第三种
因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。(可变)
首先建个Person类,以便用来解剖。
解剖的代码体现:
1 public class RelfectDemo { 2 3 public static void main(String[] args) throws ClassNotFoundException { 4 5 // 方式1 6 Person p1 = new Person(); 7 Class c1 = p1.getClass(); 8 9 Person p2 = new Person(); 10 Class c2 = p2.getClass(); 11 12 System.out.println(p1 == p2); // false 开创了2个不同的空间 13 System.out.println(c1 == c2); // true 2个Class都是得到同一个字节码文件对象 14 15 // 方式2 16 Class c = Person.class; 17 // int.class; 18 // String.class; 19 System.out.println(c == c1); // true 20 21 // 方式3 Class.forName(className); 里面的文件名是要全路径的 22 // 这个方法里面的文件名有两种获得方式: 23 // 一:在外面写 zl_Relfect.Person(包名加类名),再复制粘贴进去 24 // 二:右键点击想要获得的类,点击Copy Qualified Name,再粘贴进去 25 Class c3 = Class.forName("zl_Relfect.Person"); 26 System.out.println(c3 == c1); // true 27 } 28 29 }