Java:NoSuchMethodException when method 显然存在

2022-08-31 22:19:01

在我目前的项目中,我觉得有必要使用反射在Java中创建一种模拟回调系统。但是,我在使我的反射实际发挥作用时遇到问题。出错时的代码如下:

public Callback(Object parentObj, String methodName, Class<?>...parameters)
{
    if(parentObj == null)
        throw new IllegalArgumentException("parentObj cannot be null", new NullPointerException());

    Class<?> clazz = parentObj.getClass();

    // Trace debugging, see output
    for(Method m : clazz.getDeclaredMethods())
        if(m.getName().equals("myMethod")) System.out.println (m);

    try { this.method = clazz.getMethod(methodName, parameters); }
    catch(NoSuchMethodException nsme) { nsme.printStackTrace(); } // Exception caught
    catch(SecurityException se) { se.printStackTrace(); }

    this.parentObj = parentObj;
    this.parameters = parameters;
}

当我构造对象时,我使用的语法如下:Callback

new Callback(this, "myMethod", boolean.class)

当我尝试创建我的伪回调时,它命中了 catch 块。我在上面包含了一些跟踪调试,以显示我的一个方法失败的输出。输出:NoSuchMethodException

private void my.package.MyClass.myMethod(boolean)
java.lang.NoSuchMethodException: my.package.MyClass.myMethod(boolean)
    at java.lang.Class.getMethod(Class.java:1605)
    at my.package.other.Callback.<init>(Callback.java:63)

我无法弄清楚问题,所以我开始打猎,但收效甚微。我能找到的最好的是提到编译的JAR和运行时之间的版本控制冲突。但是,包含 。我的 IDE 正在运行以编译我的项目。我正在使用来运行我的 JAR。MyJar.jar/META-INF/MANIFEST.MFCreated-By: 1.6.0_02 (Sun Microsystems Inc.)C:\Program Files\Java\jdk1.6.0_02\bin\javac.exeC:\Program Files\Java\jdk1.6.0_02\bin\java.exe

我不知道为什么声称该方法不存在,但似乎没有问题找到它。帮助?:(Class.getMethodClass.getMethods


答案 1

您的方法是私有的,但只返回公共方法。getMethod()

您需要使用 .getDeclaredMethod()


答案 2

对于要使调用成功的方法,参数列表必须绝对正确。

我发现在进行反射时,小步骤很重要,因为编译器没有帮助。编写一个小片段,它实际上完全调用了在这种特定情况下所需的方法,然后当它起作用时,将其推广到这里的框架中。我将重点介绍传递的参数。