0

GroovyScriptEngine在我的 Java 应用程序中使用从不同来源动态加载代码。假设我有两个文件夹sources_A\sources_B\.

GroovyScriptEngine engine = new GroovyScriptEngine(new String[]{
    "sources_A", "sources_B"
});

在每个文件夹中,我都有希望在运行时任意实例化的 Groovy 包和类。

问题:其中一些类在两个文件夹中具有相同的(完整)名称。

所以当我运行时有一个歧义:

engine.loadScriptByName("some.package.SomeClass").newInstance()

当然,我可以创建两个不同的引擎:

GroovyScriptEngine engine_A = new GroovyScriptEngine(new String[]{"sources_A"});
GroovyScriptEngine engine_B = new GroovyScriptEngine(new String[]{"sources_B"});

但是当从这两个不同的引擎实例化的两个对象必须相互交互时,我遇到了问题:

object_from_A.someMethod(object_from_B);

错误:文件 bar.groovy 中方法 foo 中第 ** 行的参数类型不匹配

(不用说没有类型不匹配:对象具有正确的类型但由于引擎不同而无法识别)

简而言之,您是否有解决方案:

  • 具有某种方式来消除使用哪个源文件夹的歧义的单引擎解决方案?
  • 双引擎解决方案以某种方式让来自两个不同引擎的对象一起工作?
4

1 回答 1

0

Java(和 Groovy)类加载器通过其完全限定名来标识一个类,并且只能加载一次。所以,不,你不能加载 2 个同名的类(只会加载一个)。

于 2016-07-26T15:55:50.367 回答