ClassLoader 类 未在线程中正确加载

ClassLoader classes are not properly loaded in the thread

我正在使用 URLClassLoader 创建一个新的 classLoader 并尝试将其设置为当前线程的 classLoader。 但它对我来说不能正常工作。 按照我的理解,如果我给当前线程设置了一个classLoader,那么Current Thread引用的方法和接口应该来自当前的classLoader。 但我不是这样。该方法是从另一个 jar 中获取的,我正在获取 classCastExecption。 以下是获取classLoader的代码:

    public ClassLoader getClassLoader(boolean b) {

    ClassLoader loader = null;
    File file = new File(SamVariables.JAR_FILE);
    if (file.exists()){


                try {
            List<URL> urlsList = new ArrayList<URL>();
            urlsList.add(file.toURI().toURL());
            URL[] urls = new URL[urlsList.size()];
            urlsList.toArray(urls);
            URLClassLoader url = new URLClassLoader(urls);


            try { 
                loader = Class.forName("org.jboss.naming.remote.client.InitialContextFactory", false, url).getClassLoader();  

            } catch (ClassNotFoundException e) {
                loader = Class.forName("org.jboss.jms.client.JBossConnectionFactory", false, url).getClassLoader(); 
            }
            } 

        } catch (Throwable e) {
            e.printStackTrace();
        } 

    }   
    return loader; // I am successfully getting the classLoader for the class

}

I set it to the current thread

    Thread.currentThread().setContextClassLoader(getClassLoader);

But later when I try to get the topicConnectionFactory object, it gives me typecast exception:

topicConnectionFactory = (TopicConnectionFactory) topicConnectionFactObj;

它给了我 classCastException。

当我检查 TopicConnectionFactory 对象时,它来自导致问题的另一个 jar 文件。

As per my understanding, if I set a classLoader to the current thread, the methods and interfaces referenced by the Current Thread should be from the present classLoader.

不,这是一种误解。上下文 class 加载程序不会被使用,除非代码专门使用它。特别是,上下文 class 加载器不被 JVM 使用(但它被特定的 API 使用,例如用于查找 XML 解析器实现)。相反,使用原始 class 的 class 加载器。

如果您希望您的代码能够从自定义 class 加载器加载 classes,那么您必须在该 class 加载器中加载您的 classes .例如,将那些 classes 放在一个单独的 JAR 中,将该 JAR 放在 URLClassLoader class 路径上,然后使用来自该 URLClassLoader 的 load/call 您的 class 的反射。