我一直在尝试在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)
我已经谷歌搜索了很多天但没有运气。所以我知道我应该怎么解决这个问题?
答案 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);