使用java反射 设置私有变量 调用私有方法
1简单Classpackage com.ruoyi.app;class User {private String u_name;private Company company;@Overridepublic String toString() {return "User{" +"u_name='" + u_name + '\'' +", company=" + comp
·
1简单Class
package com.ruoyi.app;
class User {
private String u_name;
private Company company;
@Override
public String toString() {
return "User{" +
"u_name='" + u_name + '\'' +
", company=" + company +
'}';
}
public User() {
System.out.println(Thread.currentThread().getName() + "~~~");
}
static class Company {
private String c_name;
private void setName(String name){
c_name+=name+"setName";
}
@Override
public String toString() {
return "Company{" +
"c_name='" + c_name + '\'' +
'}';
}
}
}
2通过使用 setAccessible 解除对象的访问控制符
public static void main(String[] args) throws Exception {
Class<?> cls = Class.forName("com.ruoyi.app.User");//获取指定类的Class对象
Object obj = cls.getDeclaredConstructor().newInstance();//实例化对象(分配成员空间)
Field nameField = cls.getDeclaredField("u_name");// 获取成员对象
nameField.setAccessible(true);//放开权限没有封装了
nameField.set(obj, "卡伦人");//等价于:Person对象name="番茄强";
Field companyField = cls.getDeclaredField("company");
companyField.setAccessible(true);
Class<?> companyClass = Class.forName("com.ruoyi.app.User$Company");
Object companyObj = companyClass.getDeclaredConstructor().newInstance();
Method companyMethod = companyClass.getDeclaredMethod("setName", String.class);
companyMethod.setAccessible(true);
companyMethod.invoke(companyObj, "测试公司");
companyField.set(obj, companyObj);
System.out.println(obj);//等价于:Person对象name
}
更多推荐
已为社区贡献6条内容
所有评论(0)