我们知道通过反射可以访问私有方法,有时候就会想有什么方法可以防止私有方法被访问呢,设定SecurityManager。默认的情况下SecurityManager是空的。
有时间可以把:SecurityManager 研究下
另外有的同学想,你既然可以set,我也可以重新给set为null啊,注意一旦set之后,重新set会抛出异常。在think in java里提到:似乎没有什么方法可以防止访问私有方法。书中讨论了各式各样的类:嵌套类,匿名内部类。也许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是解决这个的唯一方法。