Java反射机制核心应用指南
反射基础概念
反射机制支持程序化访问类的成员变量、方法和构造函数。开发工具中的参数提示和成员列表功能均基于反射实现,其核心是通过Class对象获取字段(Field)、方法(Method)和构造器(Constructor)。
示例实体类
package reflect.example;
public class UserProfile {
private String username;
private int userAge;
public String userRole;
public UserProfile(){}
public UserProfile(String username, int userAge, String userRole) {
this.username = username;
this.userAge = userAge;
this.userRole = userRole;
}
private UserProfile(String username) {
this.username = username;
}
// Getter/Setter 方法
public void setUsername(String name) { this.username = name; }
public String getUsername() { return username; }
// 其他方法
public void work() {
System.out.println(username + "工作中");
}
private void relax() {
System.out.println("休息中");
}
public String dine(String food) {
System.out.println("食用:" + food);
return "用餐完毕";
}
}
Class对象获取方式
public class ReflectDemo {
public static void main(String[] args) throws Exception {
// 1. Class.forName加载
Class cls1 = Class.forName("reflect.example.UserProfile");
// 2. 类字面常量
Class cls2 = UserProfile.class;
// 3. 实例对象获取
UserProfile user = new UserProfile();
Class cls3 = user.getClass();
System.out.println(cls1 == cls2); // 输出true
}
}
构造方法操作
Class cls = Class.forName("reflect.example.UserProfile");
// 获取所有公共构造器
Constructor[] pubCons = cls.getConstructors();
// 获取全部构造器(含私有)
Constructor[] allCons = cls.getDeclaredConstructors();
// 获取特定构造器
Constructor paramCon = cls.getDeclaredConstructor(String.class, int.class, String.class);
// 突破访问限制创建实例
paramCon.setAccessible(true);
UserProfile instance = (UserProfile) paramCon.newInstance("张三", 30, "管理员");
成员变量操作
Field[] fields = cls.getDeclaredFields();
Field nameField = cls.getDeclaredField("username");
// 获取字段值
nameField.setAccessible(true);
Object value = nameField.get(instance);
// 修改字段值
nameField.set(instance, "李四");
成员方法操作
Method workMethod = cls.getMethod("work");
Method dineMethod = cls.getMethod("dine", String.class);
// 调用方法
dineMethod.invoke(instance, "披萨");
// 获取私有方法
Method privateMethod = cls.getDeclaredMethod("relax");
privateMethod.setAccessible(true);
privateMethod.invoke(instance);
应用场景
反射机制可完整获取类元数据,结合配置文件可实现动态对象创建与方法调用,为框架开发提供核心技术支撑。