加载名称冲突的groovy类

时间:2016-07-26 15:20:00

标签: java groovy classloader groovyclassloader groovyscriptengine

我在Java应用程序中使用GroovyScriptEngine从不同的源动态加载代码。我们说我有两个文件夹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中第**行的参数类型不匹配

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

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

  • 使用某种方法消除使用哪个源文件夹的单引擎解决方案?
  • 这个双引擎解决方案可以让两个不同引擎的对象一起工作吗?

1 个答案:

答案 0 :(得分:0)

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