gpt4 book ai didi

java - 如何避免使用反射来创建新实例

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:26 26 4
gpt4 key购买 nike

我有一个 Singleton 类,它是通过按需持有者初始化来实现的。根据this文章,它仍然容易受到反射攻击。

如何防止 java 反射调用私有(private)构造函数并创建新实例?

这是我的SingletonTest类:

class SingletonTest{
public SingletonTest(){
System.out.println("before SingletonTest()");
Singleton s1 = Singleton.getSingleton();
Singleton s2 = Singleton.getSingleton();

System.out.printf("s1 Hash: %d\n",System.identityHashCode(s1));
System.out.printf("s2 Hash: %d\n",System.identityHashCode(s2));

Constructor<?> con = Singleton.class.getDeclaredConstructors()[1];
con.setAccessible(true);

//System.out.println(con.toString());

try {
Singleton s3 = (Singleton) con.newInstance();
System.out.printf("s3 Hash: %d\n",System.identityHashCode(s3));
} catch (Exception ex) {
ex.printStackTrace();
}

System.out.println("after SingletonTest()");
}

public static void main(String[] args){
new SingletonTest();
}
}

这是我的Singleton类:

final public class Singleton {
private Singleton(){
System.out.println("Singleton created...!");
}

public static Singleton getSingleton(){
return SingletonHolder.INSTANCE;
}

static class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}

public void doStuff(){
System.out.println("dostuff....");
}

}

输出:

before SingletonTest()
Singleton created...!
s1 Hash: 1924489565
s2 Hash: 1924489565
Singleton created...!
s3 Hash: 294316734
after SingletonTest()

最佳答案

在构造函数中检查并抛出异常怎么样?

private Singleton(){
if(SingletonHolder.INSTANCE !=null)
throw new IllegalStateException("Not allowed!");
}

另一种可能性是,使用 java Enum 实现单例模式。

public enum Singleton {
INSTANCE;
public void doStuff(){...}

}

关于java - 如何避免使用反射来创建新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com