`

如何防止通过反射访问私有方法

阅读更多
我们知道通过反射可以访问私有方法,有时候就会想有什么方法可以防止私有方法被访问呢,设定SecurityManager。默认的情况下SecurityManager是空的。
有时间可以把:SecurityManager 研究下
package com.patterns;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.Permission;
import java.security.SecurityPermission;

import sun.reflect.Reflection;



public class Test{
	public static void main(String[] args) throws NoSuchMethodException, SecurityException{
		A a = new A();
		SecurityManager sp = System.getSecurityManager();
		Class cl = a.getClass();
		
		Method m = cl.getDeclaredMethod("test", (Class[])null);
		m.setAccessible(true);
	}
}

class A{
	static{
		System.setSecurityManager(new SecurityManager());
	}
	private void test(){
		System.out.println("hello");
	}
}

另外有的同学想,你既然可以set,我也可以重新给set为null啊,注意一旦set之后,重新set会抛出异常。在think in java里提到:似乎没有什么方法可以防止访问私有方法。书中讨论了各式各样的类:嵌套类,匿名内部类。也许SecurityManager是解决这个的唯一方法。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics