getDeclaredMethod不起作用,NoSuchMethodException

时间:2013-03-17 19:49:15

标签: java reflection

我一直在尝试在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一样,请在test.getClass()之后的"Test"中添加getDeclaredMethod以及更多内容。

这是堆栈跟踪:

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

我已经谷歌搜索了很多天但没有运气。所以我知道我应该怎么解决这个问题?

4 个答案:

答案 0 :(得分:25)

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

试试这个:

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

以及:

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

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

  

如果底层方法是静态的,那么指定的obj参数是   忽略。它可能为空。

答案 1 :(得分:2)

有两个问题:

问题1是你必须设想目标方法的HHS参数签名:

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

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

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


如果方法为class,您 将实例的invoke作为目标传递给static方法。

答案 2 :(得分:1)

如果您检查JavaDoc for Class.getDeclaredMethod(),则可以看到它需要参数类型数组。

答案 3 :(得分:0)

        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);