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

原创 2004年10月27日 23:21:00

在一些特殊的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对象,再在该对象上得到成员对象。

 

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

 

 

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

 

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

 

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

 

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


作者DaiJiaLin                   

mailto:woodydai@gmail.com

http://blog.csdn.net/DaiJiaLin

C++类外直接访问私有成员

C++类外面如何访问私有成员变量?只要有该对象的指针就可以访问。
  • ywh254
  • ywh254
  • 2016年03月14日 13:23
  • 892

Python类的私有成员

#!/usr/bin/env python #-*- coding:utf8 -*- """ Python中类的成员函数、成员变量默认都是公开的(public), 而且Python中没有类似p...
  • ajaxuser
  • ajaxuser
  • 2012年07月25日 20:21
  • 3182

Java访问类中的私有成员(private member)

一般而言,一个类只允许访问另一个类中的public 然而当我们非要访问私有成员的时候,这时候Java的反射机制就用得上了。package com.comac.reflect; public cla...
  • sinat_36246371
  • sinat_36246371
  • 2016年10月13日 22:36
  • 1139

C++ 为什么类的构造函数可以访问类的私有成员?解惑

看下面的例子程序:class Point{public:Point(int xx=0,int yy=0){x=xx;y=yy;}Point(Point &p){x=p.x; //这里访问了p对象的私...
  • wesleyluo
  • wesleyluo
  • 2010年05月20日 08:51
  • 2565

访问类私有成员变量

下面列举了“非类成员”访问“类私有成员变量”的3种方法:     1.通过类公有成员函数set(), get()写、读私有成员;     2.通过类公有成员函数get()获取私有成员的指针或引用,...
  • Since20140504
  • Since20140504
  • 2016年05月12日 18:03
  • 1310

友元函数 无法访问 类私有成员

#include  02usingnamespacestd;  03classcylinder  04{  05    friendistream operator>>(istream& is,cyl...
  • zz457887107
  • zz457887107
  • 2011年05月27日 07:58
  • 1365

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

在一些特殊的Java应用里面,有可能需要访问或修改类的私有成员,Reflection API可以帮助我们做到这一点。   下面是一个利用Reflection API修改private Field...
  • guoshaogang
  • guoshaogang
  • 2012年02月02日 10:57
  • 179

使用类的反射机制来访问类的私有成员变量

首先我们来看个实例吧,一般根据Java的语法,类的私有成员变量只能被内部的方法所访问;但是通过类的反射机制,却可以访问这个类的所有变量(包括私有成员变量), 我们这个实例吧。 import java....
  • Leonardo9029
  • Leonardo9029
  • 2015年03月16日 16:25
  • 1525

类外通过void指针间接访问类内私有成员变量

A member of a class can be — private; that is, its name can be used only by members and friends of ...
  • sgzqc
  • sgzqc
  • 2016年05月20日 10:21
  • 884

python 类私有成员

Python中默认的成员函数,成员变量都是公开的(public),而且python中没有类似public,private等关键词来修饰成员函数,成员变量。 在python中定义私有变量只需要在变...
  • mafuli007
  • mafuli007
  • 2012年07月24日 08:01
  • 2316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Reflection API访问类的私有成员
举报原因:
原因补充:

(最多只允许输入30个字)