java反射, 不看你可别后悔

Wesley13
• 阅读 862

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

我们先来个实体瞧瞧, 给你个对象你也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
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Stella981 Stella981
3年前
Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,
Stella981 Stella981
3年前
Spring Boot 2下使用Feign找不到@EnableFeignClients的解决办法
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2
Stella981 Stella981
3年前
Jenkins发送邮件
<divid"content\_views"class"markdown\_viewsprismatomonedark"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelineca
Wesley13 Wesley13
3年前
Java8中的LocalDateTime工具类
<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
CentOS7开启docker远程访问
<divid"content\_views"class"markdown\_viewsprismdracula"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"rou
Stella981 Stella981
3年前
Neo4j
<divid"content\_views"class"markdown\_viewsprismgithubgist"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap