无法通过java反射调用方法:NoSuchMethodException
我们正在处理一个动态类加载器项目,并试图通过URLClassLoader在动态加载的类中调用一个方法。当它在Eclipse中运行时,它工作得非常好,所以调用类和动态加载的类被捆绑到两个不同的JAR中,然后部署到服务器中,因为将其拆分为两个JAR是需求的一部分无法通过java反射调用方法:NoSuchMethodException,java,eclipse,reflection,Java,Eclipse,Reflection,我们正在处理一个动态类加载器项目,并试图通过URLClassLoader在动态加载的类中调用一个方法。当它在Eclipse中运行时,它工作得非常好,所以调用类和动态加载的类被捆绑到两个不同的JAR中,然后部署到服务器中,因为将其拆分为两个JAR是需求的一部分 NoSuchMethodException调用mapClass.getDeclaredMethod(“运行”,oneParam)时引发异常 我们已经验证了Jar,并确认类中存在被调用的方法 下面是示例代码 import com.altova
NoSuchMethodException
调用mapClass.getDeclaredMethod(“运行”,oneParam)
时引发异常
我们已经验证了Jar,并确认类中存在被调用的方法
下面是示例代码
import com.altova.io.Input;
import com.altova.io.FileInput;
Input sourceInput = new FileInput(inputFileFullPath);
Class oneParam[] = { Input.class };
Object mapObj = mapClass.newInstance();
Method method = mapClass.getDeclaredMethod(RUN, oneParam);
li = (List) method.invoke(mapObj, sourceInput);
异常为
java.lang.NoSuchMethodException:
com.sample.test.TrackingService.run(com.altova.io.Input)
我怀疑的唯一区别是输入(在方法签名中)和文件输入(在参数中)
它在Eclipse中运行良好,但在服务器中不起作用。它是用JDK1.6和1.7测试的,但服务器是在JDK1.7上运行的
第二种选择。。尝试如下所示,但这次它抛出
java.lang.IllegalArgumentException:参数类型不匹配
代码
(方法:mapClass.getDeclaredMethods())的{
方法setAccessible(true);
if(method.getName().equals(“run”)){
类[]params=method.getParameterTypes();
如果(参数长度==2){
if(参数[0].isInstance(sourceInput)和¶ms[1].isInstance(outputStream)){
li=(List)method.invoke(mapObj、sourceInput、outputStream);
System.out.println(“解析完成:”;
}
}
}}
似乎您正在尝试调用非公共方法。您所需要的就是:
Method=mapClass.getDeclaredMethod(运行,oneParam);
方法setAccessible(true);
当类加载器如下图所示更改时,它工作
URLClassLoader=newurlclassloader(newurl[]{newurl(“file:/opt/jars/Tracking.jar”)},this.getClass().getClassLoader())代码>
一切照旧。。。正如我所说,在eclipse中运行时,不添加当前的类加载器也能正常工作。感谢vsminkov的评论。已编辑帖子,调用getDeclaredMethod()时出错。已按建议尝试。。但是这次它抛出了java.lang.IllegalArgumentException:参数类型不匹配,有什么建议吗?@Ramesh在mapClass
中是否有多个run
方法?在您的编辑中,您试图使用两个参数调用run
run,而您只演示了单个参数run(com.altova.io.Input)
我正在测试两个场景,其中方法run包含一个参数和两个参数,但是我忘了提到签名为run(String,String)的重载方法
或运行(字符串)
。因此,每个类都包含一组run
方法,其中字符串和输入为param,或者run(String,String)
或run(Input,Output)
。还有一点,今天进一步测试,当类位于class_路径中时,它也可以在服务器中工作,如果通过URLClassLoader加载类,则不起作用<代码>URLClassLoader=新的URLClassLoader(URL);类mapClass=Class.forName(“com.sample.test.TrackingService”,true,loader);对象mapObj=mapClass.newInstance();类参数[]={Input.Class,Output.Class};方法m=mapClass.getDeclaredMethod(“运行”,参数);outputList=(List)m.invoke(mapObj,输入,输出)
NoSuchMethodException:com.sample.test.MappingMapToTrackingService.run(com.altova.io.Input,com.altova.io.Output)
@Dirk Lachowski感谢您的编辑,使帖子清晰易懂。
for (Method method : mapClass.getDeclaredMethods()) {
method.setAccessible(true);
if (method.getName().equals("run")) {
Class<?>[] params = method.getParameterTypes();
if (params.length == 2) {
if (params[0].isInstance(sourceInput) && params[1].isInstance(outputStream)) {
li = (List<ByteArrayOutputStream>) method.invoke(mapObj, sourceInput, outputStream);
System.out.println(" Parsing is complete:");
}
}
}}