无法通过java反射调用方法:NoSuchMethodException

无法通过java反射调用方法:NoSuchMethodException,java,eclipse,reflection,Java,Eclipse,Reflection,我们正在处理一个动态类加载器项目,并试图通过URLClassLoader在动态加载的类中调用一个方法。当它在Eclipse中运行时,它工作得非常好,所以调用类和动态加载的类被捆绑到两个不同的JAR中,然后部署到服务器中,因为将其拆分为两个JAR是需求的一部分 NoSuchMethodException调用mapClass.getDeclaredMethod(“运行”,oneParam)时引发异常 我们已经验证了Jar,并确认类中存在被调用的方法 下面是示例代码 import com.altova

我们正在处理一个动态类加载器项目,并试图通过URLClassLoader在动态加载的类中调用一个方法。当它在Eclipse中运行时,它工作得非常好,所以调用类和动态加载的类被捆绑到两个不同的JAR中,然后部署到服务器中,因为将其拆分为两个JAR是需求的一部分

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:");
        }
    }
}}