反射机制是什么

Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。

Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

白话理解一下反射:

我们编译时知道类或对象的具体信息,此时直接对类和对象进行操作即可,无需使用反射(reflection)

如果编译不知道类或对象的具体信息,此时应该如何做呢?这时就要用到 反射 来实现。比如类的名称放在XML文件中,属性和属性值放在XML文件中,需要在运行时读取XML文件,动态获取类的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Test {
public static void main(String[] args) throws Exception {
//编码/编译的时候,已经知道要创建哪个类的对象,此时和反射没关系
//创建对象
Animal an = new Cat();
//操作属性
an.nickName ="旺财";
an.color = "黑色";
//执行方法
an.shout();
an.run();
//编码/编译的时候,不知道要创建哪个类的对象,只有根据运//行时动态获取的内容来创建对象
//使用Properties类读取属性文件,最终得到了类的完整路径字符串
String className = "com.bjsxt.why.Cat";
//创建对象
Class clazz = Class.forName(className);
Object an2 = clazz.newInstance();
//操作属性
//执行方法
}
}

Class类

Java中有一个名为Class的类,该类在运行时保留有关对象和类的所有信息。

Class对象描述了特定类的属性。该对象用于执行反射。

创建Class类的对象

我们可以创建Class的对象,通过使用forName()方法

forName()接受字符串参数(类的名称)并返回Class对象。返回的对象引用字符串指定的类。例如,

1
2
Class Dog {  }
Class c1 = Class.forName("Dog");

getClass()方法使用特定类的对象来创建新的对象Class。例如,

1
2
Dog d1 = new Dog()
Class c1 = d1.getClass();

我们还可以使用.class扩展名创建Class对象。例如,

1
Class c1 = Dog.class;

创建Class对象后,我们可以使用这些对象执行反射,获取接口,超类,方法等等类的信息。