FunTester 反射执行 Groovy 类方法 NoSuchMethodException 解答

FunTester · 2021年04月26日 · 484 次阅读

最近我在尝试实现分布式性能测试功能的拓展,其中的一个思路就是通过反射执行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 官方合作媒体,非著名测试开发。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册