假设我的应用程序的外部库中有一个单例类。但我仍然可以 使用反射创建该特定类的实例。喜欢这个
Class clas = Class.forName(Private.class.getName());
for(Constructor c : clas.getDeclaredConstructors()){
c.setAccessible(true);
Private p = (Private) c.newInstance();
System.out.println(p);
}
我该如何限制?
由于 Ĵ
答案 0 :(得分:6)
使用SecurityManager并控制ReflectPermission("suppressAccessChecks")
(example)。
安全管理器会影响性能,但很少在服务器端使用。
答案 1 :(得分:1)
见Hack any Java class using reflection attack和 How to set SecurityManager and Java security policy programmatically。
答案 2 :(得分:1)
如果您特别谈论单身人士:这就是为什么实施这些单身人士的最佳方式是通过枚举的原因之一:
public enum YourSingleton {
INSTANCE;
// methods go here
}
如果您正在谈论一般使用setAccessible()
:如果代码是由您不信任的人编写的,那么您不应该运行它(或者运行它一个沙箱)。在开发人员中,公共/私人应该被视为关于如何使用代码的元信息 - 而不是安全功能。
答案 3 :(得分:0)
答案 4 :(得分:0)
我认为你不能限制这一点。
使用反射访问其他人的私有部分( snicker )显然是一种危险/可疑的做法,但有时需要各种类型的工具和应用程序。
答案 5 :(得分:0)
AFAIK这是一种元编程,因此需要检查不同的抽象层。我想从Javadoc,您应该使用SecurityManager来强制执行您想要的行为:setAccessible()。 通常恕我直言,当你进行元编程时,你应该真的知道你在做什么,改变访问权应该有充分的理由去做。
答案 6 :(得分:0)
你可以这样做。
private static final Private INSTANCE = new Private();
private Private() {
if(INSTANCE !=null)
throw new IllegalStateException("Already instantiated");
}
public static Private getInstance() {
return INSTANCE;
}