2010-01-17 8 views
1

Je charge dynamiquement une classe externe à partir de mon application eclipse rcp avec urlClassLoader. La méthode invoke() renvoie un objet de type auto-défini.java.lang.ClassCastException lors de la conversion Object-result de java.lang.reflect.Method.invoke

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; 

Quand je suis en train de jeter cet objet, je reçois le java.lang.ClassCastException: rts.data.RTSDataSet ne peut pas être jeté à rts.data.RTSDataSet. Il me semble, que la raison en est que j'ai ici différents ClassLoader. Ma question est: comment dois-je définir le ClassLoader correctement?
Merci de votre aide!

Répondre

1

Utilisez le formulaire à deux arguments URLClassLoader.newInstance pour définir le chargeur de classe parent comme étant celui du code appelant.

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

Merci beaucoup, ça marche! – kosmo

+0

Cela n'aurait pas fonctionné 'URLClassLoader cl = URLClassLoader.newInstance (url, oldClassLoader);'? –

+0

Le gentleman d'élite Dépend de ce que 'oldClassLoader' était ... Vous ne voulez presque jamais compter sur' Thread.getContextClassLoader'. –