我正在应用程序的新线程中运行某些特定域脚本。线程中的classloader仅具有应用程序的所有类。
该应用程序还具有一个模块,该模块在运行时(在应用程序之外创建的类(中加载了罐子中的其他类,为应用程序的其他部分提供了其他功能。
不幸的是,这两个类负载器没有合并,运行脚本时,我无法加载我知道的任何类别中的类。
尝试了this.getClass().getClassLoader().loadClass("external.cls")
不进行。
我还尝试了Reflections reflections = new Reflections("external.cls")
而没有成功。
有没有办法在运行时访问我的脚本运行线程中的这些类?类似:
- 获得加载外部类的另一个类加载程序?
- 使用反射从两个类加载程序中获取外部类?
- 在我的脚本运行线程中再次加载外部罐子?
您在问题中概述的大多数选项都会起作用。
使用反射从两个类加载程序中获取外部类?
不会。类加载大约是在类路径中查找类,并使其可用。反思无济于事。是否加载类无关紧要,因为它在类文件中直接引用。或因为您致电class.forname((。
对于其他两个选项:
在我的脚本运行线程中再次加载外部罐子?
可能是实施的"最简单";但是,当然,这意味着重新加载课程;换句话说:再次工作。取决于我们正在谈论的课程数量,这可能微不足道,也可能很昂贵。
获得加载外部类的另一个类加载程序?
需要您 rework "脚本类"加载程序。当它找不到类时,它必须将loadClass((调用委托给那些"其他"类加载程序。
很可能是您的第一个选择可以以干净,直截了当的方式实现 - 但不是免费的;您必须编写代码才能实现。
在主要应用程序的一个类中创建对附加类加载程序的静态引用。首次加载其他类时,请进行设置。运行脚本时,它将已经在那里为您提供已由JVM加载和缓存的其他类,或者加载更多尚未加载的类。主类加载程序对附加装置的这种依赖性将正确反映应用程序取决于其他模块的事实。