在JAVA中,在运行时从另一个类加载器获取对类的引用

在JAVA中,在运行时从另一个类加载器获取对类的引用,java,class,reflection,classloader,Java,Class,Reflection,Classloader,我正在应用程序的新线程中运行一些特定于域的脚本。线程中的类加载器只有应用程序的所有类 该应用程序还有一个模块,在运行时在应用程序外部创建的类的文件夹中加载JAR中的其他类,为应用程序的其他部分提供附加功能 不幸的是,这两个类加载器没有合并,在运行我的脚本时,我无法加载我知道存在于其中一个外部jar中的任何类 已尝试此操作。getClass.getClassLoader.loadClassexternal.cls不可用 我还尝试了Reflections=newReflectionsExternal

我正在应用程序的新线程中运行一些特定于域的脚本。线程中的类加载器只有应用程序的所有类

该应用程序还有一个模块,在运行时在应用程序外部创建的类的文件夹中加载JAR中的其他类,为应用程序的其他部分提供附加功能

不幸的是,这两个类加载器没有合并,在运行我的脚本时,我无法加载我知道存在于其中一个外部jar中的任何类

已尝试此操作。getClass.getClassLoader.loadClassexternal.cls不可用

我还尝试了Reflections=newReflectionsExternal.cls,但没有成功

有没有一种方法可以在运行时访问脚本中运行线程的那些类?比如:

是否可以访问加载外部类的另一个类加载器? 使用反射从两个类装入器获取外部类? 在脚本运行线程中再次加载外部JAR?
您在问题中概述的大多数选项都有效

使用反射从两个类装入器获取外部类

不会。类加载是关于在类路径中查找类,并使它们可用。反思在这方面没有帮助。加载类并不重要,因为它直接在类文件中引用;或者因为你叫Class.forName

对于其他两个选项:

在脚本运行线程中再次加载外部JAR

可能是最容易实现的;但当然,这意味着重新加载类;换句话说:重新开始工作。根据我们所讨论的课程数量,这可能是微不足道的,或者是相当昂贵的

是否可以访问加载外部类的另一个类加载器

将要求您重新编写该脚本类装入器。当它找不到类时,它必须将loadClass调用委托给其他类加载器


最有可能的是,您的第一个选项可以以一种干净、直接的方式实现——但它不是免费的;必须编写代码才能实现这一点。

在主应用程序的一个类中创建对附加类加载器的静态引用。第一次加载其他类时,请进行设置。在运行脚本时,它已经在那里为您提供了额外的类,这些类已经由JVM加载和缓存,或者加载更多尚未加载的类。主类加载器对附加模块的这种依赖关系将正确反映应用程序依赖于附加模块的事实。

感谢heaps。我可以重新加载jar,只是在脚本完成后,它会在最后留下两个自定义类加载器吗?否则,是否有任何代码示例显示如何在当前线程中访问其他类加载器?