反射执行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

终于淌过了一条小溪流。再等等我完善一下测试框架的分布式执行性能测试脚本的拓展,再来分享!


FunTester腾讯云年度作者Boss直聘签约作者GDevOps官方合作媒体,非著名测试开发。

posted @   FunTester  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· 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种方法--最后放大招
点击右上角即可分享
微信分享提示