我有一個帶有抽象方法runATask
的類SomeTaskManager
。 我想通過反射執行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;
}
我得到這個錯誤
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)
什麼問題? –
呃,你不能執行抽象方法 - 沒有什麼可執行的。 –
如果方法在子類中實現,並且在實例化後使用該子類的實例,則可以這樣做。無論如何,你需要向我們展示堆棧跟蹤。我們不知道該方法需要什麼參數,或者您傳遞的參數的類型。此外,你的循環應該處理代碼,找到「runATask」方法然後中斷,而不是跳過那些不是那樣的。這是一個巨大的代碼味道。 –