您的位置:首页 > 编程语言 > Java开发

Java中利用反射对类的hidden成员方法和属性的访问

2012-02-07 21:43 555 查看
java中通过访问控制符来控制对类成员的访问,private 成员表示只在类的内部才可以被访问,但是利用java的反射机制却可以再类的外部来访问类的私有成员

下面是个简单的例子来说明这一点

package com.eric.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
*
* this class mainly for explain how to access hidden method or field
*
*
*
* archive $ProjectName: $
*
* @author Admin
*
* @version $Revision: $ $Name: $
*/
public class AccesHiddenElements {
public static void main(String[] args) {
Inter inter = new InterImpl();
inter.f();
if (inter instanceof InterImpl) {
// use class cast to method that in InterImpl class
((InterImpl) inter).g();
// can't access h method
// ((InterImpl) inter).h();
}
// (1)javap -private InterImpl to get all method name eg h()
// (2)use reflect to access private method
accessMehodByName(inter, "h");
accessFieldByName(inter, "name");
Inter annousInter = new Inter() {
public void f() {
System.out.println("f() method in annousInter");
}

private void g() {
System.out.println("g() method in annousInter");
}

};
accessMehodByName(annousInter, "g");
}

static void accessMehodByName(Object obj, String methodName) {
try {
Method method = obj.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}

static void accessFieldByName(Object obj, String methodName) {
try {
Field field = obj.getClass().getDeclaredField(methodName);
field.setAccessible(true);
System.out.println(field.getInt(obj));
} catch (Exception e) {
e.printStackTrace();
}
}

}

interface Inter {
public void f();
}

class InterImpl implements Inter {
//私有属性,正常情况下外部类不可以访问此方法


 private int name = 10;public void f() {System.out.println("f() in InterImpl");}public void g() {System.out.println("g() in InterImpl");} //私有方法,正常情况下外部类不可以访问此方法private void h() {System.out.println("h() in InterImpl");}}/* * * History: * * * * $Log: $ */

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息