介绍:
Java反射机制是指在运行时动态地获取类的信息并操作类的属性、方法、构造函数等。通过反射,我们可以在编译时无法确定类的情况下,还能够创建对象、调用方法、访问字段等。
Java反射机制提供了以下主要的类和接口:
- Class类:代表一个类或接口,在运行时可以获取并操作该类的属性、方法、构造函数等信息。
- Field类:代表类的属性,用于获取和设置类的字段值。
- Method类:代表类的方法,用于在对象上执行方法操作。
- Constructor类:代表类的构造函数,用于创建类的实例对象。
- Modifier类:提供用于访问修饰符的静态方法。
使用反射机制可以实现以下功能:
- 获取类的信息:可以通过Class类的静态方法
forName()获取指定名称的类;也可以通过对象的getClass()方法获取类的信息。 - 创建对象:可以通过Class类的
newInstance()方法实例化一个对象,或者通过Constructor类的newInstance()方法创建一个对象。 - 调用方法:可以通过Method类的
invoke()方法调用类的方法。 - 访问属性:可以通过Field类的
get()和set()方法获取和设置类的字段值。 - 获取注解:可以使用反射机制获取类、方法、字段上的注解信息。
DEMO:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Person {
private String name;
public Person() {
this.name = "John Doe";
}
public Person(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("Hello, my name is " + name);
}
private void privateMethod() {
System.out.println("This is a private method");
}
public String getName() {
return name;
}
}
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
// 获取类的信息
Class<Person> personClass = Person.class;
// 创建对象
Person person1 = personClass.newInstance();
System.out.println(person1.getName());
Constructor<Person> constructor = personClass.getConstructor(String.class);
Person person2 = constructor.newInstance("Alice");
System.out.println(person2.getName());
// 调用方法
Method sayHelloMethod = personClass.getMethod("sayHello");
sayHelloMethod.invoke(person2);
// 访问属性
Field nameField = personClass.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(person2, "Bob");
System.out.println(person2.getName());
// 调用私有方法
Method privateMethod = personClass.getDeclaredMethod("privateMethod");
privateMethod.setAccessible(true);
privateMethod.invoke(person2);
}
}