Java反射框架和安全性

时间:2010-04-16 11:49:30

标签: java reflection

假设我的应用程序的外部库中有一个单例类。但我仍然可以 使用反射创建该特定类的实例。喜欢这个

    Class clas = Class.forName(Private.class.getName());

    for(Constructor c : clas.getDeclaredConstructors()){
        c.setAccessible(true);
        Private p = (Private) c.newInstance();
        System.out.println(p);
    }

我该如何限制?

由于 Ĵ

7 个答案:

答案 0 :(得分:6)

使用SecurityManager并控制ReflectPermission("suppressAccessChecks")example)。

安全管理器会影响性能,但很少在服务器端使用。

答案 1 :(得分:1)

答案 2 :(得分:1)

如果您特别谈论单身人士:这就是为什么实施这些单身人士的最佳方式是通过枚举的原因之一:

public enum YourSingleton {
    INSTANCE;
    // methods go here
} 

如果您正在谈论一般使用setAccessible():如果代码是由您不信任的人编写的,那么您不应该运行它(或者运行它一个沙箱)。在开发人员中,公共/私人应该被视为关于如何使用代码的元信息 - 而不是安全功能。

答案 3 :(得分:0)

长话短说:你不能

任何构造函数(public和private)都可以通过反射访问,并可用于实例化新对象。

您需要采用其他方法,例如SecurityManager

答案 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;
        }
相关问题