Zor*_*orb 0 java reflection android abstract-class abstract
我有一个SomeTaskManager抽象方法的类runATask.我想runATask通过反射执行方法,这是我的代码:我错过了什么?
SomeTaskManager pm= (SomeTaskManager)context.getSomeTaskManager();
Class c = Class.forName( pm.getClass().getName() );
Method[] allMethods = c.getDeclaredMethods();
for (Method m : allMethods) {
if (!m.getName().equals("runATask")) {
continue;
}
m.invoke( c ,new Object[] { someParam, null, 1});
break;
}
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误
java.lang.IllegalArgumentException: object is not an instance of the class
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at de.vogella.android.downloadmanager.DownloadManagerActivity.riflesso(DownloadManagerActivity.java:250)
at de.vogella.android.downloadmanager.DownloadManagerActivity.onCreate(DownloadManagerActivity.java:68)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
at android.app.ActivityThread.access$1500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)java.lang.IllegalArgumentException: object is not an instance of the class at java.lang.reflect.Method.invoke(Method.java:507)
啊哈,在这里
m.invoke(c, new Object[] { someParam, null, 1});
Run Code Online (Sandbox Code Playgroud)
你传递的Class不是它的实例.您需要将pm(具体实例)传递给它:
m.invoke(pm, new Object[] { someParam, null, 1});
Run Code Online (Sandbox Code Playgroud)
如果你使用完整的和自我记录的变量名而不是没有说 - 缩写,那么只需阅读代码就可以更快地发现这个问题.我建议也要这样做.
与具体问题无关,以下行
Class c = Class.forName( pm.getClass().getName() );
Run Code Online (Sandbox Code Playgroud)
可简化如下
Class c = pm.getClass();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4071 次 |
| 最近记录: |