Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制转换java.lang.reflect.Method.invoke的对象结果时发生java.lang.ClassCastException_Java_Eclipse_Reflection_Invoke_Classcastexception - Fatal编程技术网

强制转换java.lang.reflect.Method.invoke的对象结果时发生java.lang.ClassCastException

强制转换java.lang.reflect.Method.invoke的对象结果时发生java.lang.ClassCastException,java,eclipse,reflection,invoke,classcastexception,Java,Eclipse,Reflection,Invoke,Classcastexception,我使用urlClassLoader从eclipse rcp应用程序动态加载一个外部类。invoke()-方法返回自定义类型的对象 ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); URLClassLoader cl = URLClassLoader.newInstance( url); Thread.currentThread().setContextClassLoader(cl);

我使用urlClassLoader从eclipse rcp应用程序动态加载一个外部类。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;
ClassLoader oldClassLoader=Thread.currentThread().getContextClassLoader();
URLClassLoader cl=URLClassLoader.newInstance(url);
Thread.currentThread().setContextClassLoader(cl);
字符串className=“myClass”;
c类=cl.loadClass(类名);
Object inst=c.newInstance();
方法run=c.getMethod(“run”,新类[0]);
Object rdsObject=run.invoke(inst,新对象[]{});
Thread.currentThread().setContextClassLoader(oldClassLoader);
rts.data.RTSDataSet rds=(rts.data.RTSDataSet)rdsObject;
当我试图强制转换这个对象时,我得到java.lang.ClassCastException:rts.data.RTSDataSet不能强制转换为rts.data.RTSDataSet。在我看来,原因是这里有不同的类加载器。我的问题是:如何正确设置类加载器?

谢谢你的帮助

使用两个参数形式的
URLClassLoader.newInstance
将父类装入器设置为调用代码的装入器

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

使用
URLClassLoader.newInstance
的双参数形式将父类装入器设置为调用代码的装入器

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

这难道不起作用吗
URLClassLoader cl=URLClassLoader.newInstance(url,oldClassLoader)?精英绅士取决于
oldClassLoader
是什么。。。您几乎不想依赖
Thread.getContextClassLoader
。这难道不起作用吗
URLClassLoader cl=URLClassLoader.newInstance(url,oldClassLoader)?精英绅士取决于
oldClassLoader
是什么。。。您几乎不想依赖
线程.getContextClassLoader