覆盖java类加载器

时间:2012-04-19 09:04:45

标签: java classloader

我有以下示例

public class Tester
{

    /**
     * @param args
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException
    {

        new Tester().execute();

    }

    private void execute() throws ClassNotFoundException
    {
        //Java Class Loader
        ClassLoader baseClassLoader = Thread.currentThread().getContextClassLoader();

        //Java custom Class Loader
        ClassLoader customClassLoader = new CustomClassLoader();
        Class<?> customClass = Class.forName("a.b.c.d.class", true, customClassLoader);

        //Java custom Class Loader
        ClassLoader customClassLoader = customClass.getClassLoader();

        Thread.currentThread().setContextClassLoader(customClassLoader);

        //Java custom Class Loader
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();

        //Java Class Loader?????
        ClassLoader classLoader = this.getClass().getClassLoader();
    }
}

调用后的原因

Thread.currentThread().setContextClassLoader(customClassLoader);

一旦我执行

this.getClass().getClassLoader(); 

我仍然得到java类加载器而不是我的自定义类加载器。

我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:0)

Thread.setContextClassLoader只需在Thread中设置一个变量。链接类仍然是从每个类的类加载器完成的。它肯定不会改变任何已经加载的类的类加载器。它改变的只是Thread.getContextClassLoader返回的类加载器。

我建议远离线程上下文类加载器和其他线程全局。