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

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: $ */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值