15

我一直在尝试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)

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

4

4 回答 4

31

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

试试这个:

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

除此之外:

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

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

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

于 2013-03-17T19:52:42.433 回答
2

有两个问题:

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

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

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

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


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

于 2013-03-17T19:58:35.437 回答
1

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

于 2013-03-17T19:54:10.617 回答
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);
于 2015-07-01T11:07:38.743 回答