gpt4 book ai didi

java - 如何破解单例?

转载 作者:行者123 更新时间:2023-11-30 09:14:21 24 4
gpt4 key购买 nike

如何打破java中的单例类?单例模式确保一个类只有一个实例,并提供一个全局访问点。

该类的默认构造函数是私有(private)的,这防止了其他类直接实例化该对象。

静态修饰符应用于返回对象的实例方法,因为它使该方法成为无需创建对象即可访问的类级别方法

编辑:

public class Singleton {
private static Singleton singleInstance;

private Singleton() {
System.out.println("Singleton Constructor Running...");
}
public static Singleton getInstance() {
if (singleInstance == null) {
synchronized (Singleton.class) {
if (singleInstance == null) {
singleInstance = new Singleton();
}
}
}
return singleInstance;
}
}

使用反射打破单例

import java.lang.reflect.Constructor;

public class BreakSingletonUsingReflection {
public static void main(String[] args) {
Singleton instanceOne = Singleton.getInstance();
Singleton instanceTwo = null;
try {
Constructor[] constructors = Singleton.class.getDeclaredConstructors();
for (Constructor constructor : constructors) {
//Below code will destroy the singleton pattern
constructor.setAccessible(true);
instanceTwo = (Singleton) constructor.newInstance();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(instanceOne.hashCode());
System.out.println(instanceTwo.hashCode());
}
}

最佳答案

1.

import java.lang.reflect.Constructor;


public class ReflectionSingletonTest {

public static void main(String[] args) {
EagerInitializedSingleton instanceOne = EagerInitializedSingleton.getInstance();
EagerInitializedSingleton instanceTwo = null;
try {
Constructor[] constructors = EagerInitializedSingleton.class.getDeclaredConstructors();
for (Constructor constructor : constructors) {
//Below code will destroy the singleton pattern
constructor.setAccessible(true);
instanceTwo = (EagerInitializedSingleton) constructor.newInstance();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(instanceOne.hashCode());
System.out.println(instanceTwo.hashCode());
}

}

2.

单例类:

package com.singleton.securitymgr;

public class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {
System.out.println("Singleton Constructor Running...");
}

public static final Singleton getInstance() {
return INSTANCE;
}
}

测试类:

package com.singleton.securitymgr;

import java.lang.reflect.Constructor;

public class Test {

public static void main(String[] args) throws Exception {

Singleton s = Singleton.getInstance();

Class clazz = Singleton.class;

Constructor cons = clazz.getDeclaredConstructor();
cons.setAccessible(true);

Singleton s2 = (Singleton) cons.newInstance();
}
}

关于java - 如何破解单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20559790/

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