getDeclaredMethod不起作用,NoSuchMethodException(getDec

2019-07-21 20:14发布

我一直在尝试使用Reflection在Java中,但它并没有结束得不错。 这里是我的代码:

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)

我一直在,但没有运气谷歌搜索了很多天。 所以,我没有人知道我应该如何解决这一问题?

Answer 1:

您可以指定一个名称getDeclaredMethod但没有使用参数,虽然Test方法确实有其签名的参数。

试试这个:

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

伴随着这一点:

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

由于第一个参数Method.invoke期望的对象。 但是这种说法在静态方法的情况下被忽略:

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



Answer 2:

有两个问题:

问题1是必须soecify目标方法的参数HHS签署:

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

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

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


仅供参考,你通过class的实例作为目标的invoke方法,如果该方法是static



Answer 3:

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



Answer 4:

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


文章来源: getDeclaredMethod doesn't work, NoSuchMethodException