利用Reflection API访问类的私有成员
来源:互联网 发布:matlab 离散数据滤波 编辑:程序博客网 时间:2024/05/17 22:44
在一些特殊的Java应用里面,有可能需要访问或修改类的私有成员,Reflection API可以帮助我们做到这一点。
下面是一个利用Reflection API修改private Field的例子。(访问私有函数也可以用类似的方法)
假设有一个类Dummy:
public class Dummy { public int getValue() { return _value; } private int _value = 0; } |
需要将Dummy对象中_value的值改为1,可以用以下的Reflection代码来完成:
Dummy d = new Dummy(); System.out.println(d.getValue()); try { Field f = d.getClass().getDeclaredField("_value"); f.setAccessible(true); f.set(d, new Integer(1)); f.setAccessible(false); } catch (NoSuchFieldException ex) { // ... } catch (IllegalAccessException ex) { // ... } System.out.println(d.getValue()); |
运行上面的程序,可以看到_value的值从0变成了1。
Class类还有一个getField()的方法,不过这个方法只能返回public的Field。要访问private或protected的成员,需要调用getDeclared…这一系列的方法。值得注意的是,getDeclared…的方法只返回类直接声明的成员,如需访问父类的成员,需要先得到父类的Class对象,再在该对象上得到成员对象。
要访问拿到的成员对象,还需要修改其访问控制的状态。setAccessible(true)让我们可以对其访问。setAccessible(false)又将它设为Java的缺省访问控制。
使用Reflection API访问类的私有成员一般有两种用途:
1. 实现某种对象持久化的功能,比如,将一个对象存储到XML文件里面以及再将其读出的功能。利用Reflection API访问对象成员可以实现这一点,而且对象也不再需要满足一些特殊的要求,如实现某个接口或满足bean的规范。
2. 在继承一个现有的类的时候,需要在子类中访问父类的private成员。有时我们没办法修改父类的代码将该成员改为protected,就只好利用Reflection API。
第二种情况实际上有可能是父类的一个设计问题,父类的设计不应该妨碍子类对其进行扩展(Open-Close原则),而把成员声明成private往往会影响这种扩展性。这个问题意味着在设计类的时候,我们应该小心的使用private,更多的使用protected来定义私有成员。
作者:DaiJiaLin
http://blog.csdn.net/DaiJiaLin
- 利用Reflection API访问类的私有成员、私有方法
- 利用Reflection API访问类的私有成员
- 利用Reflection API访问类的私有成员 .
- 利用反射访问类的私有成员
- C# 反射机制(reflection)实现对私有成员的访问
- java利用反射访问类的私有成员
- 访问类的私有成员
- 访问类的私有成员
- 访问私有类成员
- 类的私有数据成员的访问
- 用#define访问类的私有成员
- c#访问类的私有成员
- 指针访问类的私有成员
- 访问类中的私有成员的
- 如何直接访问类的私有成员?
- 类访问自身的私有成员
- iOS访问类的私有成员变量及私有方法
- iOS访问类的私有成员变量及私有方法
- Layout and Style
- python扩展_swig例子
- tomcat4.1下配置servlet
- 我的第一个正式程序
- 搞笑帖
- 利用Reflection API访问类的私有成员
- Welcome.java
- 面向对象设计原则 (摘录)
- SetWindowRedraw(hwndList, FALSE);无闪烁重画
- WinPcap编程渐进教程(中文)
- 依赖注入
- Atlassian Confluence 的中文搜索问题的解决
- VB 实现隐形程序
- VB.NET里奇怪的数组赋值现象