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

时间:2017-06-26 07:48:56

标签: java class reflection classloader

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

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

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

试了this.getClass().getClassLoader().loadClass("external.cls")没有去。

我也试过Reflections reflections = new Reflections("external.cls")但没有成功。

有没有办法在运行时运行线程的脚本中访问这些类?类似的东西:

  • 获取加载外部类的另一个类加载器的访问权限吗?
  • 使用反射从两个类加载器中获取外部类?
  • 在我的脚本运行线程中再次加载外部jar?

2 个答案:

答案 0 :(得分:1)

您在问题中列出的大多数选项都有效。

  

使用反射从两个类加载器中获取外部类?

不会。类加载是关于在类路径中查找类,并使它们可用。反思并没有帮助。加载类是没关系的,因为它是在类文件中直接引用的;或者因为你调用了Class.forName()。

对于其他两个选项:

  

在我的脚本运行线程中再次加载外部jar?

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

  

获取加载外部类的另一个类加载器的访问权限吗?

会要求你返工那个“脚本类”加载器。当它找不到类时,它必须将loadClass()调用委托给那些“其他”类加载器。

最有可能的是,你的第一个选择可以以干净,直接的方式实施 - 但它并非免费提供; 必须编写代码才能实现这一目标。

答案 1 :(得分:0)

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