Singleton模式可以被内部类破坏?

时间:2017-04-30 14:50:42

标签: java security singleton inner-classes

我在Singleton模式之后编写了一个类,并希望为它编写一个内部类。 令我担心的是内部类能够访问所有外部类私有字段,包括单个实例的私有字段,我同样假设私有构造函数。

是否有可能攻击单例并在有权访问内部类的构造函数时创建它的第二个实例?

我在想某种从内部类的实例导航到类的构造函数。 例如:

class Outer{

    private static Outer instance;
    private Outer(){}
    public static Outer getInstance(){
    if(instance==null)instance= new Outer();
    return instance;
    }

    class Inner{
    public Inner(){}

}

现在类似于:

public class Main{

    public static void main(String[]args){
    Outer outer = Outer.getInstance();
    Inner inner = outer.new Inner();
    Outer outer2 = inner.Outer.this.new Outer();
    }

}

注意到最后一行不可编辑我认为可能还有其他方法来导航"一旦有一个内部类的对象,就可以使用外部类的构造函数。

2 个答案:

答案 0 :(得分:1)

  

令我担心的是,内部阶级能够访问所有内容   外部类私有字段,包括私有字段   单个实例,我同样假设私有构造函数。

这就是内部类生活的全部目的,阅读更多here,内部类是针对当你想要将某个类的某个状态保持为私有但仍想要一个有凝聚力的类来访问它时的情况,所以在那种情况下,你为这个顶级班级做了一个内部课程。

  

是否有可能攻击单身并制作第二个实例   当一个人有权访问内部类的构造函数时?

如果您为顶级类实现了正确的单例模式,那么没有人可以创建顶级类的另一个实例。

另外,如果您正在考虑其他情况,那么当您创建内部类的实例时,它不会创建外部类的实例,也不会再有一些情况,例如,如果您有一个静态内部类,那么您确实需要一个顶级类的实例,但是如果你有一个非静态的内部类,那么首先你需要创建一个顶级类的实例,然后你创建你的内部类的实例,但重点是创建一个内部类的实例不会创建外部类的另一个实例,所以如果你在我们的外部类中正确实现了单例模式,那么你就可以了。

我建议你阅读内部课程here

  

单一模式可以被内部类破坏吗?

通过上面的解释,答案是否定的,在顶级类中正确实现单例模式,它的内部不能创建顶级类的另一个实例。

答案 1 :(得分:0)

您的问题似乎表明您正在尝试阻止攻击者对您的源代码进行特定更改。如果某人已具有该级别的访问权限,则地球上没有可以保护您免受攻击的安全措施。