代码核心功能说明:
- 类动态加载
Class.forName("Person")
运行时加载类 - 构造对象
- 无参构造:
getDeclaredConstructor().newInstance()
- 有参构造:指定参数类型并实例化
- 字段操作
- 公共字段:
getField()
直接访问 - 私有字段:
getDeclaredField()
+setAccessible(true)
突破限制
- 方法调用
- 普通方法:
getMethod()
+invoke()
- 私有方法:同样需
setAccessible(true)
- 异常处理
所有反射异常直接抛出到main
方法外(简化代码)
关键技巧:
- 获取方法时需指定参数类型(如
getMethod("getInfo", String.class)
) - 调用私有成员必须使用
setAccessible(true)
- 有参构造需通过
getDeclaredConstructor
明确参数类型列表
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
// ================== 1. 动态加载类 ==================
Class<?> personClass = Class.forName("Person");
// ================== 2. 反射创建对象 ==================
// 无参构造创建对象
Object person1 = personClass.getDeclaredConstructor().newInstance();
// 有参构造创建对象(需指定参数类型)
Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, int.class);
Object person2 = constructor.newInstance("张三", 25);
System.out.println("有参构造对象: " + person2); // 输出: Person[name=张三, age=25]
// ================== 3. 操作字段 ==================
// 修改公共字段
Field nameField = personClass.getField("name");
nameField.set(person1, "李四");
// 修改私有字段(需突破访问限制)
Field ageField = personClass.getDeclaredField("age");
ageField.setAccessible(true); // 解除私有权限
ageField.set(person1, 30);
System.out.println("修改后对象: " + person1); // 输出: Person[name=李四, age=30]
// ================== 4. 调用方法 ==================
// 调用公共无参方法
Method displayMethod = personClass.getMethod("display");
displayMethod.invoke(person1); // 输出: Person{name='李四', age=30}
// 调用重载方法(带参数)
Method infoMethod = personClass.getMethod("getInfo", String.class);
String info = (String) infoMethod.invoke(person1, "测试信息");
System.out.println("带参方法调用: " + info); // 输出: 姓名:李四 年龄:30 | 测试信息
// 调用私有方法
Method secretMethod = personClass.getDeclaredMethod("secretMethod");
secretMethod.setAccessible(true);
secretMethod.invoke(person1); // 输出: 私有方法被调用!
}
}
// 被反射操作的类
class Person {
public String name;
private int age;
public Person() {
this.name = "默认名";
this.age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("Person{name='" + name + "', age=" + age + "}");
}
public String getInfo(String extra) {
return "姓名:" + name + " 年龄:" + age + " | " + extra;
}
private void secretMethod() {
System.out.println("私有方法被调用!");
}
@Override
public String toString() {
return "Person[name=" + name + ", age=" + age + "]";
}
}