Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不同的类装入器中创建不同的单例实例?_Java_Singleton_Classloader - Fatal编程技术网

Java 如何在不同的类装入器中创建不同的单例实例?

Java 如何在不同的类装入器中创建不同的单例实例?,java,singleton,classloader,Java,Singleton,Classloader,我有一个应用程序,它使用类加载器层次结构来运行插件。我们在服务器级别有一个父类加载器,然后每个插件都有子类加载器。每个插件都可以访问几个专门用于该插件的服务,我想通过一个单例提供访问 public class PluginServices { private static PluginServices _instance = null; private PluginServices() { } public static PluginServices getIns

我有一个应用程序,它使用类加载器层次结构来运行插件。我们在服务器级别有一个父类加载器,然后每个插件都有子类加载器。每个插件都可以访问几个专门用于该插件的服务,我想通过一个单例提供访问

public class PluginServices {
    private static PluginServices _instance = null;
    private PluginServices() {
    }
    public static PluginServices getInstance() {
        if (_instance == null) {
            _instance = new PluginServices();
        }
        return _instance;
    }

    public static Service1 getService1() { ... }        
    public static Service2 getService2() { ... }        

}
然而,当我从插件访问单例时,我总是得到相同的实例,而不是每个插件一个新的实例。这似乎是因为PluginServices的.class位于父类加载器加载的JAR中,因此实例绑定到该类加载器而不是我的插件类加载器


是否有任何方法可以将PluginServices单例实例绑定到插件的类加载器,从而每个插件都有自己的实例?

您必须在类加载器中找到单例类,并使用newInstance创建一个实例。但是,当然,这有点否定了这一切的单一性。或者您可以找到类,然后使用反射来访问singleton访问方法-可能更好一些。这就是singleton的点,确保它只有一个实例。当然,您需要创建singleton来包含指向您创建的singleton的指针。