1.什么是反射
JAVA反射机制(Reflection)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
打个比方,反射就好比我们去医院做CT一样,通过CT可以观察我们的五脏六腑。
与Java反射相关的类如下:
| 类名 | 用途 |
|---|---|
| Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
| Field类 | 代表类的成员变量(成员变量也称为类的属性) |
| Method类 | 代表类的方法 |
| Constructor类 | 代表类的构造方法 |
| Annotation类 | 代表类的注解 |
java反射整体知识点导图如下:

2.Class对象
说到反射,首先要了解什么是Class。每个类都会产生一个对应的Class对象,一般保存在.class文件中。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。类加载时,类加载器首先会检查这个类的Class对象是否已被加载过,如果尚未加载,默认的类加载器就会根据类名查找对应的.class文件。
使用java的反射机制必须首先要获取这个类的类对象(Class对象)。
获取类对象有以下三种方式:
实例:
通过三种方式获取Person类的类对象。
class Person{
private String name;
private String gender;
private String birthday;
public Person() {
}
public Person(String name, String gender, String birthday) {
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
public class ClassObjectDemo {
public static void main(String[] args) throws Exception {
//1.使用Class.forName
Class clazz1 = Class.forName("demo.Person");
//2.使用对象.getClass();
Person p = new Person();
Class clazz2 = p.getClass();
//3.使用类名.class
Class clazz3 = Person.class;
System.out.println(clazz1.getName());
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
}
}
运行结果:
demo.Person
true
true
通过上例,我们发现一个类的类对象也是单例的。