Java笔记之利用反射访问或修改private成员
对于类A、B,A是B的基类,A有一个私有成员name
A.java
public class A {
private String name = "A"; public void print() {
System.out.println(name);
}
}
B.java
public class B extends A {
}
对于A对象a,要想改变a的name,可以这样操作:
try {
Field nameFieldInA = a.getClass().getDeclaredField("name");
nameFieldInA.setAccessible(true);
nameFieldInA.set(a, "一");
a.print();
} catch (NoSuchFieldException | IllegalAccessException ex) {
ex.printStackTrace();
}
要访问a的name,可执行nameFieldInA.get(a)
对于B对象b,要改变b的name,可以这样:
import java.lang.reflect.Field; public class Main {
public static void main(String[] args) {
try {
B b = new B();
b.print();
Field field = b.getClass().getSuperclass().getDeclaredField("name");
field.setAccessible(true);
field.set(b, "B");
b.print();
} catch (NoSuchFieldException | IllegalAccessException ex) {
ex.printStackTrace();
}
}
}
Java笔记之利用反射访问或修改private成员的更多相关文章
- java利用反射访问类的私有(private)属性及方法
Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...
- Java中的反射机制,利用反射访问私有
利用反射,首先是Class对象的获取,之后是Method和Field对象的获取. 以Method为例,从文档中可以看到: getMethod()方法返回的是public的Method对象, 而getD ...
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- private修饰的方法可以通过反射访问,那么private的意义是什么?
反射代码: package test; public class Person { private String userName= "Tom"; private void pla ...
- 深入理解Java中为什么内部类可以访问外部类的成员
内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, ...
- Java 同一个类的不同实例对象竟然可以相互访问各自的private成员
如题,在看String源码的某个函数时,发现了这个操作是被允许的,而且可以直接改变private字段(不是final按理是可以改变),这与之前的理解有点相背. 接下来试图整理下Google来的结论: ...
- java如何在静态方法中访问类的实例成员
类的静态方法是不能直接访问实例的成员的,它只能访问同类的静态成员.访问实例的成员的话,可以参考一下这个方法,那就是把静态方法的参数设置为类的实例,这样通过参数传递的方式就可以访问实例的成员了,例子如下 ...
- c#利用反射Assembly 对类和成员属性进行操作
protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...
随机推荐
- Mac下Android SDK更新不了的解决办法
在hosts文件中加入: 203.208.46.146 dl.google.com 203.208.46.146 dl-ssl.google.com
- Chtml的一些例子
<!-- 如果是修改的话,调用已关联的单元 --> <?php foreach ($unionZones as $unit) { echo CHtml::openTag('div', ...
- Win32 绘制RGB三原色图案
以前看到三原色的图案,一直很好奇是如何画出来.后来终于搞清楚了,其实很简单,实际上就是RGB三个分量的"位与"运算. 下面给出Win32绘制三原色图案的例子,特此记录在此: #in ...
- LeetCode OJ--Binary Tree Level Order Traversal
http://oj.leetcode.com/problems/binary-tree-level-order-traversal/ 树的层序遍历,使用队列 由于树不是满的,还要分出每一层来,刚开始给 ...
- iOS-开发者账号失效后是否还可以打包
参考链接:https://www.jianshu.com/p/601f596e8550
- POJ 1797 Heavy Transportation SPFA变形
原题链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- linux tomcat shutdown.sh 有时不能结束进程,使用如下指令进度重启
ps -ef | grep tomcat | grep -v grep | cut -c 9-15 | xargs kill -9 & ./startup.sh
- JSP页面顶端出现错误:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path的问题解决
原理:把RunTime容器添加进去,比如tomcat的. 1.项目右键->[Build Path]->[Configure Build Path...] 2.把tomcat的runtime ...
- 如何给redis设置密码
如何给redis设置密码 学习了:https://blog.csdn.net/qq_35357001/article/details/56835919
- 非常easy的JAVA反射教程
原创文章,转载请注明. 反射能够动态载入类,实例化对象,调用方法.如今以下面样例解说. 一.载入类. Class clazz = Class.forName("java.lang.Strin ...