从外部访问类中的私有方法的方法

使用反射机制,需要知道这个方法名(摘自think in java)

package access.intefacea;

public interface A {
	void f();
}

 

package access.pmethod;
import access.intefacea.*;
class C implements A{
	public void f() {
		System.out.println("public C.f()");
	}
	public void g(){
		System.out.println("public C.g()");
	}
	void u(){
		System.out.println("package C.u()");
	}
	protected void v(){
		System.out.println("protected C.v()");
	}
	private void w(){
		System.out.println("private C.w()");
	}
}

public class HiddenC {
	public static A makeA(){
		return new C();
	}
}

 

package access.test;
import java.lang.reflect.Method;
import access.intefacea.*;
import access.pmethod.*;

public class HiddenImplementation {
	public static void main(String[] args) throws Exception {
		A a = HiddenC.makeA();
		a.f();
		System.out.println(a.getClass().getName());
		//在这里C是不可见的
		/*
		if(a instanceof C){
			C c = (C)a;
			c.g();
		}
		*/
		callHiddenMethod(a, "g");
		callHiddenMethod(a, "u");	//访问包访问权限的方法
		callHiddenMethod(a, "v");	//访问proctected权限的方法
		callHiddenMethod(a, "w");	//访问私有权限方法
		//如果不知道方法名,可以通过javap -private C来获得
	}
	static void callHiddenMethod(Object a, String methodName) throws Exception{
		Method g = a.getClass().getDeclaredMethod(methodName);
		g.setAccessible(true);	//设置为不检查权限
		g.invoke(a);
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值