开发中, 难免遇到些私有的属性和方法, 就好比下面的实体一样, 我们该怎么获得, 并玩弄于手掌呢?

我们先来个实体瞧瞧, 给你个对象你也new不了, hahaha… 单身wang

public class Student {
private String name;
private int age;
private Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(){
throw new IllegalAccessError("就不给你创建");
}
private String getName() {
return name == null ? "" : name;
}
private void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

在反射中如果是私有的, 不管是私有方法, 还是私有属性, 都必须在操作前设置setAccessible为false. 你要不设, 就等着GG呗!

反射步骤

1. 首先我们要找到要操作的对象

通过Class.forName(“…”), 找到你对象, 里面就写 包名+对象名, 后缀就算了, 谁不知道是个女的啊!

Class<?> clz = Class.forName("top.huiger.Student");

2. 找到对象在哪了, 但是我们还没找到创建的构造方法是不行的, 关于找哪个构造方法, 自己选择, 自己的对象自己找.

clz.getDeclaredConstructor(String.class, int.class);

3. 那我们来创建, 记得上面的找的构造方法是什么, 要匹配上才行.

Object student = constructor.newInstance("张三", 18); // 张三还是如花 看你爱好

4. 找到对象了, 我们来调用下, 但是公开的和私有的又有区别

  • 公开

clz.getMethod(“getAge”);

Method getAge = clz.getMethod("getAge");
System.out.println("--------------" + getAge.invoke(student));
  • 私有

clz.getDeclaredMethod(“getName”);, 上面说过, 私有的都要设置可修改的权限

Method getName = clz.getDeclaredMethod("getName");
getName.setAccessible(true);
String name = (String) getName.invoke(student);
System.out.println("--------------" + name);

5. 修改属性, 和调用方法类似

// 找到私有属性
Field age = clz.getDeclaredField("age");
age.setAccessible(true);
age.setInt(student, 20); // 修改属性
System.out.println("--------------"+age.get(student));

全部演练代码都在这

Class<?> clz = Class.forName("top.huiger.Student");
// 找到带有这个参数的构造方法
Constructor constructor = clz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
// 初始化对象
Object student = constructor.newInstance("张三", 18);
System.out.println("--------------"+constructor.toString()); // 找到该私有方法
Method getName = clz.getDeclaredMethod("getName");
getName.setAccessible(true);
String name = (String) getName.invoke(student);
System.out.println("--------------"+name); // 找到私有属性
Field age = clz.getDeclaredField("age");
age.setAccessible(true);
age.setInt(student, 20); // 修改属性
System.out.println("--------------"+age.get(student));

最后输出

--------------private com.dong.wine.Student(java.lang.String,int)
--------------张三
--------------20

原文地址:https://blog.csdn.net/zhihui_520/article/details/80136598

最新文章

  1. 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
  2. 在.NET Core控制台程序中使用依赖注入
  3. NPOI操作EXCEL(二)——大量不同模板时设计方式
  4. Can&#39;t load IA 32-bit .dll on a AMD 64-bit platform错误的解决
  5. SSIS excel2003文件导入列名显示为F1,F2 - FN
  6. JavaScript学习03 JS函数
  7. centos7删除已经安装的docker
  8. 移动端设页面根目录HTML的字体大小
  9. Java基础-数据类型int,short,char,long,float,double,boolean,byte
  10. MYSQL多实例配置与使用教程
  11. 利用servlet技术实现验证码功能
  12. HDOJ 1316 How Many Fibs?
  13. URL中特殊符号的处理
  14. Python-字符版gif图
  15. 如何在Mac系统安装MySQL
  16. javascript es6 箭头函数
  17. Windows caffe VGG人脸识别
  18. android开发资源
  19. 史前埃及(predynastic egypt)
  20. springcloud-feign的hystrix支持

热门文章

  1. Spring Cloud(2)主要组件应用实例
  2. webkit内核的浏览器常见7种分别是..
  3. R list和data frame 排序
  4. php 客户端调用elasticsearch接口
  5. [CF1093E]Intersection of Permutations:树套树+pbds
  6. nginx修改默认运行80端口的方法
  7. Swift hash &amp; hashValue区别
  8. [CSP-S模拟测试]:树(树上上升序列+主席树+线段树)
  9. Python List 列表list()方法
  10. HTML canvas中translate()与rotate()的理解