0

Java 애플리케이션 내에서 GroovyScriptEngine을 사용하여 다른 소스에서 동적으로 코드를로드합니다. 두 개의 폴더 sources_A\sources_B\이 있다고 가정 해 보겠습니다.충돌하는 이름으로 groovy 클래스로드하기

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

각 폴더에는 런타임에 임의로 인스턴스화하려는 Groovy 패키지와 클래스가 있습니다.

문제점 : 이러한 클래스 중 일부는 두 폴더에서 모두 (전체) 이름을 갖습니다. 두 개체가이 두 가지에서 인스턴스화 할 때

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

하지만 내가 문제로 실행 : 나는 두 개의 서로 다른 엔진을 만들 수 있습니다, 물론

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

:

그래서 내가 실행할 때 모호성이있다 서로 다른 엔진이 상호 작용해야한다 :

object_from_A.someMethod(object_from_B); 

Error: argument type mismatch at line ** in method foo in file bar.groovy

(이 어떤 유형 불일치 없다고 말할 필요도없이 : 개체가 올바른 유형이 있지만, 다른 엔진으로 인해 인식되지 않습니다) :

당신이 해결책을해야합니까, 짧은에서

중 하나에

  • 어떤 소스 폴더가 사용되었는지 명확히하기위한 하나의 엔진 솔루션이 있습니까?
  • 서로 다른 두 엔진의 객체를 함께 사용하는 두 가지 방법이 있습니다.

답변

0

Java (및 Groovy) 클래스 로더는 클래스를 정규화 된 이름으로 식별하며 한 번만로드 할 수 있습니다. 아니요, 동일한 이름의 클래스 2 개를로드 할 수 없습니다 (하나만로드됩니다).

+0

한 번에 하나의 버전을로드하고 싶습니다. 문제는 내가로드 된 버전을 제어 할 수 없다는 것입니다. 클래스 로더에게로드해야하는 두 가지 버전을 알려주는 방법이 없습니까? –

+0

Nope. 당신은 그것을 제어 할 수 없습니다. 좋은 소식은 코드를 클래스에로드 한 후 선택 논리를 코드에 통합하고 올바른 소스 코드 디렉토리만으로 엔진을 만드는 것입니다. – JBaruch

관련 문제