在Java中,我们使用System.setProperty()方法来设置一些系统属性.根据这篇文章,使用系统属性有点棘手.
System.setProperty()可能是一个邪恶的调用.
- 这是100%线程敌对
- 它包含超全局变量
- 当这些变量在运行时神秘地改变时,调试极其困难.
我的问题如下.
系统属性的范围如何?它们是否特定于每个虚拟机,或者它们具有"超级全局特性",它在每个虚拟机实例上共享相同的属性集?我猜选项1
是否有任何工具可用于监视运行时更改以检测系统属性中的更改.(仅为了便于检测问题)
我正在开发一个设计模式,我想确保这里只是Java虚拟机中一个类的一个实例,通过一个点来汇集对某些资源的所有请求,但我不知道它是否可行.
我只能想到一种方法来计算类的实例并在创建第一个实例后销毁所有实例.
这是一种正确的方法吗?如果没有,还有其他方法吗?
我正在设计下面的单身人士课程,我知道我的单身人士可以被打破
public class SingletonObject {
private static SingletonObject ref;
private SingletonObject () //private constructor
{ }
public static synchronized SingletonObject getSingletonObject()
{
if (ref == null)
ref = new SingletonObject();
return ref;
}
public Object clone() throws CloneNotSupportedException
{throw new CloneNotSupportedException ();
}
}
Run Code Online (Sandbox Code Playgroud)
下面的url已经建议单例可以用其他方法破解单例,但是我的查询是这个url中建议单例可以被类加载器破坏,同样的类可以由两个不同的类加载器加载,因此,你可以通过在由两个不同类加载器加载的类中调用其getInstance()方法来创建单例类的两个实例.这种方法可以工作,而不必诉诸于违反私人构造函数.
ClassLoader cl1 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
ClassLoader cl2 = new URLClassLoader(new URL[]{"singleton.jar"}, null);
Class<?> singClass1 = cl1.loadClass("hacking.Singleton");
Class<?> singClass2 = cl2.loadClass("hacking.Singleton");
//...
Method getInstance1 = singClass1.getDeclaredMethod("getInstance", ...);
Method getInstance2 = singClass2.getDeclaredMethod("getInstance", ...); …
Run Code Online (Sandbox Code Playgroud)