gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:12:34 31 4
gpt4 key购买 nike

我们正在开发一个动态类加载器项目,并尝试通过 URLClassLoader 调用动态加载类中的方法。它在 Eclipse 中运行时工作得很好,因此调用和动态加载的类被捆绑到两个不同的 jar 中,然后部署到服务器中,因为它是拆分为两个 jar 的要求的一部分。

使用反射 API 调用 mapClass.getDeclaredMethod("run", oneParam) 时抛出

NoSuchMethodException 异常。

我们已经验证了 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);

异常(exception)是

java.lang.NoSuchMethodException:      
com.sample.test.TrackingService.run(com.altova.io.Input)

我怀疑的唯一区别是输入(在方法签名中)和文件输入(在参数中)。

它在 Eclipse 中运行良好,但在服务器中则不然。它使用 JDK 1.6 和 1.7 进行了测试,但服务器在 jdk 1.7 上运行

第二个选项..尝试如下所示,但这次它抛出

java.lang.IllegalArgumentException:参数类型不匹配

代码

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

最佳答案

您似乎正在尝试调用非公共(public)方法。你所需要的就是让它accessible :

Method method = mapClass.getDeclaredMethod(RUN, oneParam);
method.setAccessible(true);

关于java - 无法通过java反射调用方法: NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38972178/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com