反射执行Groovy类方法NoSuchMethodException解答
最近我在尝试实现分布式性能测试功能的拓展,其中的一个思路就是通过反射执行jar
包中写好的测试方法达到自动执行性能测试用例的目的。但是在进行技术验证的时候,遇到了一个坑,就是在使用com.funtester.frame.execute.ExecuteSource#executeMethod(java.lang.String, java.lang.Object...)
方法运行用例的时候,总是会报错:
INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
WARN-> 方法属性处理错误!
java.lang.NoSuchMethodException: com.funtest.javatest.FunTester.test()
at java.lang.Class.getMethod(Class.java:1786) ~[?:1.8.0_281]
at com.funtester.frame.execute.ExecuteSource.executeMethod(ExecuteSource.java:115) [classes/:?]
at com.funtest.javatest.FunTester.main(FunTester.java:16) [classes/:?]
WARN-> 反射执行方法失败:com.funtest.javatest.FunTester.test
java.lang.IllegalAccessException: Class com.funtester.frame.execute.ExecuteSource can not access a member of class com.funtest.javatest.FunTester with modifiers "static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) ~[?:1.8.0_281]
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) ~[?:1.8.0_281]
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) ~[?:1.8.0_281]
at java.lang.reflect.Method.invoke(Method.java:491) ~[?:1.8.0_281]
at com.funtester.frame.execute.ExecuteSource.executeMethod(ExecuteSource.java:132) [classes/:?]
at com.funtest.javatest.FunTester.main(FunTester.java:16) [classes/:?]
Process finished with exit code 0
起初我忽略了第二个错误,因为第一个错误导致Method
对象创建失败导致的。
下面是我测试代码:
package com.funtest.javatest;
import com.funtester.frame.SourceCode;
import com.funtester.frame.execute.ExecuteSource;
import java.io.IOException;
public class FunTester extends SourceCode {
public static void main(String[] args) throws IOException {
ExecuteSource.executeMethod("com.funtest.javatest.FunTester.test");
}
static void test() {
output("FunTester成功了!");
}
}
在经过大量查询资料和修改代码进行测试的过程后,我都要放弃了。又重新翻阅了代码提交记录,对于了文章命令行如何执行jar包里面的方法时的代码,依然没有发现问题。
我重新看了一下第二个错误java.lang.IllegalAccessException: Class com.funtester.frame.execute.ExecuteSource can not access a member of class com.funtest.javatest.FunTester with modifiers "static"
,这个信息让我想起来Groovy
的特性,就是省略关键字public
的功能,这样一来,方法的第一个关键字变成了static
。
顿觉茅塞顿开!!!
修改代码如下:
public static void test() {
output("FunTester成功了!");
}
控制台输出如下:
INFO-> 当前用户:oker,工作目录:/Users/oker/IdeaProjects/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> FunTester成功了!
Process finished with exit code 0
终于淌过了一条小溪流。再等等我完善一下测试框架的分布式执行性能测试脚本的拓展,再来分享!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2020-04-26 删除List中null的N种方法--最后放大招