当前位置: 首页 > 知识库问答 >
问题:

Java:NoSuchMethodException当方法明显存在时

司马萧迟
2023-03-14

在我目前的项目中,我觉得有必要在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)

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

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和运行时之间的版本控制冲突。然而,MyJar。jar/META-INF/MANIFEST。MF包含由以下人员创建的:1.6.0_02(Sun Microsystems Inc.)。我的IDE正在运行C:\Program Files\Java\jdk1。6.0_02\bin\javac。exe来编译我的项目。我使用的是C:\Program Files\Java\jdk1。6.0_02\bin\java。exe来运行我的JAR。

我不知道为什么课。getMethod声称该方法不存在,但是类。getMethods似乎很容易找到它。帮助?:(


共有3个答案

夹谷飞龙
2023-03-14

Javadoc for getMethod不是显式的,但它看起来可能会对非公共的方法抛出NoSuchMethodException,而您的方法是私有的。

毋树
2023-03-14

您需要参数列表绝对正确,以便调用成功。

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

涂浩皛
2023-03-14

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

您需要使用getDeclaredMethod()

 类似资料:
  • 一般信息:我正在使用版本git-Spigot-1d14d5f-ba32592(MC:1.8.3)(实现API版本1.8.3-r0.1-snapshot)、IntelliJ IDEA 14.1.3中的Bukkit/spigot API并使用其默认编译器进行编译。java jdk版本为1.8.0_25。 实用工具类在一个单独的模块中,如果我将它们粘贴到测试插件模块中,而不是粘贴到其他模块中,则一切正常

  • 本文向大家介绍显示声明的java.lang.Math方法,包括了显示声明的java.lang.Math方法的使用技巧和注意事项,需要的朋友参考一下 可以使用java.lang.Class.getDeclaredMethods()方法列出java.lang.Math类的方法。  此方法返回一个数组,其中包含具有公共,私有,受保护和默认访问权限的所有Method对象。但是,不包括继承的方法。另外,如果

  • 我有个问题快把我逼疯了。 当我点击快捷方式查看方法描述时,我只看到方法签名。我怎样才能看到我在网上看到的完整的描述? 这是我在Ctrl+Shift+Space上看到的内容: 顺便说一下,我只是勾选了设置,当我将鼠标悬停在上面时启用快速信息;然而,问题不是它不起作用,而是它不是全部描述。我想我丢失了文件。 谢谢

  • 本文向大家介绍用Java显示当前方法名称,包括了用Java显示当前方法名称的使用技巧和注意事项,需要的朋友参考一下 包含由当前堆栈跟踪元素表示的执行点的当前方法名称由java.lang.StackTraceElement.getMethodName()方法提供。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 该方法用于获取当前方法名称,该名称包含由当前堆栈跟踪元素表示的执行点

  • 对于下面的代码Sonarqube显示错误,说“要么记录或重新抛出此异常”对于捕获块,我们如何处理相同的

  • 6.1. 方法声明 在函数声明时,在其名字之前放上一个变量,即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。 下面来写我们第一个方法的例子,这个例子在package geometry下: gopl.io/ch6/geometry package geometry import "math" type Point struct{ X, Y floa