import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class Person {
private String name;
private int age;
private Person(String name, int age) {
this.name = name;
this.age = age;
}
private void sayHello() {
System.out.println("Hello, my name is " + name + " and I am " + age + " years old.");
}
}
public class ReflectionExample {
public static void main(String[] args) {
try {
// 获取 Class 对象
Class<?> personClass = Class.forName("Person");
// 获取私有构造方法
Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true); // 设置可访问
// 创建对象实例
Object personInstance = constructor.newInstance("Alice", 25);
// 获取私有方法
Method sayHelloMethod = personClass.getDeclaredMethod("sayHello");
sayHelloMethod.setAccessible(true); // 设置可访问
// 调用方法
sayHelloMethod.invoke(personInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
获取 Class 对象:
Class.forName("Person") 获取 Person 类的 Class 对象。这允许我们在运行时动态地获取类的信息。获取私有构造方法:
personClass.getDeclaredConstructor(String.class, int.class) 获取 Person 类的私有构造方法。setAccessible(true) 使我们能够绕过 Java 的访问控制检查,调用私有构造方法。创建对象实例:
constructor.newInstance("Alice", 25) 创建 Person 类的实例。获取私有方法:
personClass.getDeclaredMethod("sayHello") 获取 Person 类的私有方法 sayHello。setAccessible(true) 使我们能够调用该私有方法。调用方法:
sayHelloMethod.invoke(personInstance) 调用 sayHello 方法,并传入之前创建的对象实例。通过反射机制,我们可以在运行时动态地操作类、构造方法和方法,即使它们是私有的。这在某些框架(如 Spring 和 Hibernate)中非常有用,可以实现依赖注入、代理等功能。
下一篇:java 冒泡排序
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站