认识Java反射机制

82 阅读2分钟

介绍:

Java反射机制是指在运行时动态地获取类的信息并操作类的属性、方法、构造函数等。通过反射,我们可以在编译时无法确定类的情况下,还能够创建对象、调用方法、访问字段等。

Java反射机制提供了以下主要的类和接口:

  1. Class类:代表一个类或接口,在运行时可以获取并操作该类的属性、方法、构造函数等信息。
  2. Field类:代表类的属性,用于获取和设置类的字段值。
  3. Method类:代表类的方法,用于在对象上执行方法操作。
  4. Constructor类:代表类的构造函数,用于创建类的实例对象。
  5. Modifier类:提供用于访问修饰符的静态方法。

使用反射机制可以实现以下功能:

  1. 获取类的信息:可以通过Class类的静态方法forName()获取指定名称的类;也可以通过对象的getClass()方法获取类的信息。
  2. 创建对象:可以通过Class类的newInstance()方法实例化一个对象,或者通过Constructor类的newInstance()方法创建一个对象。
  3. 调用方法:可以通过Method类的invoke()方法调用类的方法。
  4. 访问属性:可以通过Field类的get()set()方法获取和设置类的字段值。
  5. 获取注解:可以使用反射机制获取类、方法、字段上的注解信息。

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);
    }
}