代码之家  ›  专栏  ›  技术社区  ›  Brian S

Java:NouChuthOraceExpPress方法明显存在时

  •  33
  • Brian S  · 技术社区  · 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)
    

    当我尝试创建伪回调时,它会命中 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和运行时之间的版本控制冲突。然而, MyJar.jar/META-INF/MANIFEST.MF 包含 Created-By: 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 来运行我的坛子。

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

    4 回复  |  直到 12 年前
        1
  •  93
  •   David Titarenco    12 年前

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

    你需要使用 getDeclaredMethod() .

        2
  •  4
  •   Adam Crume    14 年前

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

        3
  •  2
  •   Thorbjørn Ravn Andersen    14 年前

    您需要参数列表完全正确才能使调用成功。

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

        4
  •  0
  •   Laurence Gonsalves    14 年前

    可能导致NoSuchMethodException的版本控制问题与编译器版本之间没有区别。这是(在你的情况下)版本的不同 MyClass 在编译时与运行时。

    不过,由于您使用的是反射,所以问题可能与版本控制无关。当然,这不能解释 getMethod getDeclaredMethods ,因为您是在同一个类实例上运行它们,所以版本差异实际上是不可能的。

    您确定参数符合您的实际方法吗?