2 回答

TA貢獻1744條經(jīng)驗 獲得超4個贊
如果您希望Singleton跨類加載器為true ,則需要一個公共父級來加載所討論的類,或者您需要自己指定類加載器。
private static Class getClass(String classname) throws ClassNotFoundException {
? ? ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
? ? if(classLoader == null)?
? ? ? ? classLoader = Singleton.class.getClassLoader();
? ? ? return (classLoader.loadClass(classname));
}

TA貢獻1946條經(jīng)驗 獲得超4個贊
這是一個濫用Properties擴展事實的技巧,這是一個Map舊的不幸的設(shè)計決定。
public final class JvmWideSingleton
{
private static final JvmWideSingleton INSTANCE;
static {
// There should be just one system class loader object in the whole JVM.
synchronized(ClassLoader.getSystemClassLoader()) {
Properties sysProps = System.getProperties();
// The key is a String, because the .class object would be different across classloaders.
JvmWideSingleton singleton = (JvmWideSingleton) sysProps.get(JvmWideSingleton.class.getName());
// Some other class loader loaded JvmWideSingleton earlier.
if (singleton != null) {
INSTANCE = singleton;
}
else {
// Otherwise this classloader is the first one, let's create a singleton.
// Make sure not to do any locking within this.
INSTANCE = new JvmWideSingleton();
System.getProperties().put(JvmWideSingleton.class.getName(), INSTANCE);
}
}
}
public static JvmWideSingleton getSingleton() {
return INSTANCE;
}
}
可以對其進行參數(shù)化,但隨后的初始化將變得很懶,并轉(zhuǎn)到getSingleton()。
Properties是Hashtable基于-的,因此它是線程安全的(根據(jù)文檔)。所以可以使用props.computeIfAbsent()。但是我更喜歡這種方式。
另請閱讀:Java系統(tǒng)屬性的范圍
我只是寫了它,有可能我忽略了某些東西,這會阻止它工作。

TA貢獻1802條經(jīng)驗 獲得超6個贊
您確定Sneha是該帖子的作者(或至少部分關(guān)于類加載器)嗎?從我所看到的鏈接文章已經(jīng)發(fā)布,8 JANUARY 2009但是它看起來與javaworld出版的相當(dāng)老文章的一部分相同Apr 25, 2003。博客上的文章甚至包含句子“ 可以使用前面的方法代替Class.forName() ”,這似乎沒有上下文,因為Class.forName()在更早的地方?jīng)]有使用任何方法,而在Javaworld中是有意義的,因為示例10使用了反射。
添加回答
舉報