当前位置:首页 > Java技术 > 正文内容

利用Reflection API访问类的私有成员

canca17年前 (2008-11-22)Java技术414

在一些特殊的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()的方法,不过这个方法只能返回publicField。要访问privateprotected的成员,需要调用getDeclared…这一系列的方法。值得注意的是,getDeclared…的方法只返回类直接声明的成员,如需访问父类的成员,需要先得到父类的Class对象,再在该对象上得到成员对象。

 

转自:http://blog.csdn.net/DaiJiaLin/archive/2004/10/27/155559.aspx


要访问拿到的成员对象,还需要修改其访问控制的状态。setAccessible(true)让我们可以对其访问。setAccessible(false)又将它设为Java的缺省访问控制。

 

 

使用Reflection API访问类的私有成员一般有两种用途:

 

1. 实现某种对象持久化的功能,比如,将一个对象存储到XML文件里面以及再将其读出的功能。利用Reflection API访问对象成员可以实现这一点,而且对象也不再需要满足一些特殊的要求,如实现某个接口或满足bean的规范。

 

2. 在继承一个现有的类的时候,需要在子类中访问父类的private成员。有时我们没办法修改父类的代码将该成员改为protected,就只好利用Reflection API

 

第二种情况实际上有可能是父类的一个设计问题,父类的设计不应该妨碍子类对其进行扩展(Open-Close原则),而把成员声明成private往往会影响这种扩展性。这个问题意味着在设计类的时候,我们应该小心的使用private,更多的使用protected来定义私有成员。

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/351.html

标签: Java技术
分享给朋友:

“利用Reflection API访问类的私有成员” 的相关文章

Socket与ServerSocket的问题

//服务器端:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.ServerSock...

Java语言的反射机制

    由于项目的需要,在项目中要实现即插即用的方式,也就是说可以动态地加载包,不用设置CLASSPATH路径。当项目发布时,不可能要用户来设置环境变量吧!因此,就要用到JAVA的反射机制了。昨天,我是在研究JAVA的JNI技术。由于没有时间,所以过几天才写JNI。今天...

JSP与Servlet的对应关系

以前在QQzone写下的文章现在贴到这里来了... 最近比较忙啊!现在抽身写一篇文章。是关于JSP与Servlet的对应关系的。希望对大家有所帮助。其实我也是刚刚学的......-------Servlet--------------JSP----------1.ServletContext&nbs...

JAVA获得一个文件夹大小

在JAVA里没有现成的方法获取一个文件夹的大小,那么我们可以用递归的方法,获取文件夹的大小。    import  java.util.*;  import  java.io.*;  class  GetFileSi...

IM技术(1)

    做项目了,NetCL今天开工了,在这些日子里,我会将自己研究的内容写下来。做个记录,以下是我在网上搜到的。关于管理用户状态的解决方案,当然,我都有一个方案。不过对客户端的任务有点重吧,我方法是客户端从服务器端获到一个用户在线状态后,接着就与服务器无关了。好友离线...

JAVA内部类终极实例

最近心情不好,不想说太多东西了!电脑坏了,我现在又病了. class ClassFactory{ private final static String userName = "Hello,My name is CAnca."; public static Thread in =...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。