getDeclaredMethod 不起作用,NoSuchMethodException



我一直在尝试在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.NoSuchMethodException错误,我几乎已经尝试了所有的方法。类似于使用getMethod而不是getDeclaredMethod,在getDeclaredMethod等中的"Test"之后添加test.getClass()

这是堆栈跟踪:

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

我已经在谷歌上搜索了很多天了,但运气不好。有人知道我该怎么解决吗?

您在getDeclaredMethod中指定了一个名称,但没有参数,尽管Test方法的签名中确实有一个参数。

试试这个:

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

连同这个:

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

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

如果基础方法是静态的,那么指定的obj参数是已忽略。它可能为null。

有两个问题:

问题1是您必须指定目标方法的HHS参数签名:

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

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

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


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

如果检查class.getDeclaredMethod((的JavaDoc,您可以看到它需要一个参数类型数组。

        final Class<?> ContextImpl =Class.forName("android.app.ContextImpl");
        Method method= ContextImpl.getDeclaredMethod("getImpl",Context.class); 
        method.setAccessible(true);  
        Context myContext=  (Context) method.invoke(ContextImpl,getApplicationContext());                     
        System.out.println("........... Private Method Accessed. : "+myContext);

相关内容

  • 没有找到相关文章

最新更新