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、付费专栏及课程。

余额充值