通过反射调用抽象方法

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)

Bal*_*usC 5

java.lang.IllegalArgumentException: object is not an instance of the class
    at java.lang.reflect.Method.invoke(Method.java:507)
Run Code Online (Sandbox Code Playgroud)

啊哈,在这里

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)