2010-01-17 4 views
1

urlClassLoader를 사용하여 이클립스 rcp 애플리케이션에서 외부 클래스를 동적으로로드합니다. invoke() - 메서드는 자체 정의 Type의 Object를 반환합니다. 나는이 객체를 캐스팅하기 위해 노력하고있어 때java.lang.reflect.Method.invoke의 Object-result를 캐스팅 할 때 java.lang.ClassCastException이 발생했습니다.

ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); 
URLClassLoader cl = URLClassLoader.newInstance(url); 
Thread.currentThread().setContextClassLoader(cl); 
String className ="myClass"; 
Class<?> c = cl.loadClass(className); 
Object inst =c.newInstance(); 
Method run =c.getMethod("run", new Class[0]); 
Object rdsObject =run.invoke(inst, new Object[]{}); 
Thread.currentThread().setContextClassLoader(oldClassLoader); 
rts.data.RTSDataSet rds =(rts.data.RTSDataSet) rdsObject; 

, 나는 java.lang.ClassCastException가 얻을 : rts.data.RTSDataSet는 rts.data.RTSDataSet으로 캐스팅 할 수 없습니다. 그 이유는 여기에 다른 ClassLoader가 있다는 것입니다. 내 질문은 : 어떻게 ClassLoader 제대로 설정해야합니까?
도움 주셔서 감사합니다.

답변

1

URLClassLoader.newInstance의 두 인수 형식을 사용하여 상위 클래스 로더를 호출 코드의 것으로 설정하십시오.

URLClassLoader loaders = URLClassLoader.newInstance(path, this.getClass().getClassLoader()); 
+0

대단히 고맙습니다. – kosmo

+0

URLClassLoader cl = URLClassLoader.newInstance (url, oldClassLoader); –

+0

Elite Gentleman 'oldClassLoader'가 무엇인지에 달렸습니다 ... 당신은 거의'Thread.getContextClassLoader'에 의지하고 싶지 않습니다. –