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