getDeclaredMethod 不起作用,NoSuchMethodException

2022-09-02 23:43:41

我一直试图在Java中使用,但它的结局并不好。这是我的代码:Reflection

public class ReflectionTest {
    public static void main(String[] args) {
        ReflectionTest test = new ReflectionTest();
        try {
            Method m = test.getClass().getDeclaredMethod("Test");
            m.invoke(test.getClass(), "Cool story bro");
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void Test(String someawesometext) {
        System.out.println(someawesometext);
    }
}

我只是得到错误,我已经尝试了几乎所有的东西。喜欢使用 代替 ,在加入之后添加更多。java.lang.NoSuchMethodExceptiongetMethodgetDeclaredMethodtest.getClass()"Test"getDeclaredMethod

下面是堆栈跟踪:

java.lang.NoSuchMethodException: ReflectionTest.Test()
at java.lang.Class.getDeclaredMethod(Unknown Source)
at ReflectionTest.main(ReflectionTest.java:10)

我已经在谷歌上搜索了很多天,但没有运气。所以我有谁知道我应该如何解决这个问题?


答案 1

您可以在 中指定名称,但不指定参数,尽管该方法的签名中确实有一个参数。getDeclaredMethodTest

试试这个:

Method m = test.getClass().getDeclaredMethod("Test", String.class);

以及:

m.invoke(test, "Cool story bro");

因为 Method.invoke 的第一个参数需要一个对象。但是,在静态方法的情况下,此参数将被忽略:

如果基础方法是静态的,则忽略指定的 obj 参数。它可能为空。


答案 2

有两个问题:

问题 1 是必须对目标方法的 HHS 参数签名进行排序:

Method m = test.getClass().getDeclaredMethod("Test", String.class);

问题 2 是您必须将实例传递给该方法:invoke()

m.invoke(test, "Cool story bro");


仅供参考,如果方法是 ,则将作为目标的实例传递给该方法。classinvokestatic