使用Different Classloader

时间:2017-10-30 10:55:20

标签: java singleton urlclassloader

我只是关注this answer并且坚持了下来。 我正在做的是保护我的Singleton类使用不同的类加载器加载两次。我没有使用任何自定义类加载器。 有没有办法停止使用URLClassLoader加载两次?

我的单身课

package hacking;

public class Singleton {
    private static Singleton ref;
    private Singleton() {
    }
    public static synchronized Singleton getSingletonObject() {
        if (ref == null)
            ref = new Singleton();
        return ref;
    }
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }
}

我从 Singleton.java 中创建了一个 jar 文件,然后加载了两次相同的jar。

package com.foo;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class SingletonTest {

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

        URL url = new URL("file:\\D:\\foo\\singleton.jar");
        ClassLoader cl1 = new URLClassLoader(new URL[] { url }, null);
        ClassLoader cl2 = new URLClassLoader(new URL[] { url }, null);

        Class<?> singClass1 = cl1.loadClass("hacking.Singleton");
        Class<?> singClass2 = cl2.loadClass("hacking.Singleton");


        Method getInstance1 = singClass1.getDeclaredMethod("getSingletonObject", null);
        Method getInstance2 = singClass2.getDeclaredMethod("getSingletonObject", null);

        Object singleton1 = getInstance1.invoke(null);
        Object singleton2 = getInstance2.invoke(null);

        System.out.println(singleton1.hashCode());
        System.out.println(singleton2.hashCode()); 
   /* this is problem i am trying to solve, cause i get two different object
     for my singleton class. */

    }

}

如何保护我的单件类在这里加载两次?我需要一个共同的父级来加载该类,但我在这种情况下如何实现?

请帮我解释一下代码,我的英语不好。

感谢你的善良和建设性。

0 个答案:

没有答案