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

我们先来个实体瞧瞧, 给你个对象你也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

java反射, 不看你可别后悔的更多相关文章

  1. 文末送书四本 | 这篇Java反射机制太经典!不看后悔!

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...

  2. Java反射(一眼就看会)

    参考:(1)http://blog.csdn.net/liujiahan629629/article/details/18013523(2)https://www.zhihu.com/question ...

  3. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

  4. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

  5. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  6. java 反射机制

    1.反射机制是什么: (1)反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能 ...

  7. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  8. java 反射的应用 以及通过反射 用到的工厂模式

    java反射详解 本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案 ...

  9. JAVA反射实践

    Java反射机制在我的理解当中就是下面几点: 1. 对一个给定的类名(以字符串形式提供)能动态构建一个对象实例 2. 对于任意一个类,都能够知道这个类的所有属性和方法     3. 对于任意一个对象, ...

随机推荐

  1. 运行biggan demo

    http://www.zhuanzhi.ai/document/8705953a704e1bf8e051c161d1587d88

  2. 系统符号二——正则表达式及三剑客之grep

    一基础正则表达式 (一)^  匹配以什么开头的信息 [root@centos71 ~]# grep "^root" /etc/passwd root:x:0:0:root:/roo ...

  3. Bugku 杂项 又一张图片,还单纯吗

    又一张图片,还单纯吗 下载后,用binwalk打开图片 使用foremost 2.png进行分离 得到图片 关于foremost foremost [-v|-V|-h|-T|-Q|-q|-a|-w-d ...

  4. Wannafly挑战赛16 #E 弹球弹弹弹 splay+基环树+各种思维

    链接:https://ac.nowcoder.com/acm/problem/16033来源:牛客网 有n个位置,标号为1到n的整数,m次操作,第i次操作放置一个弹球在b[i] xor c[i-1]处 ...

  5. 【PowerOJ1754&网络流24题】负载平衡问题(费用流)

    题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...

  6. Qt中图元对象的多重集成

    在继承自定义QGraphicsItem图元对象时,有时需要用到信号/槽机制,由于QGraphicsItem非QObject的子类 所以需要多重继承QObject,有一点需要特别注意:就是继承的顺序,一 ...

  7. 深入理解Spring(一):初识Spring

    深入理解Spring(一):初识Spring 一. Spring介绍        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  8. 我用HTML写简历

    本文属于原创文章,转载请注明--来自桃源小盼的博客 起因 每次换工作写简历都是有点痛苦的事情,尤其是下载word模板,各种注册流程,有的还得买积分,冲会员,甚是不爽.就算下载好了,修改其中的一些细节也 ...

  9. onchange and oninput

    https://www.w3schools.com/jsref/event_oninput.asp Supported HTML tags: <input type="color&qu ...

  10. textarea组件

    textarea组件:多行输入框:(文本域) textarea组件属性: value:类型 字符串 输入框的内容 placeholder:类型 字符串 输入框为空时的占位符 placeholder-s ...