假設我有我的Android應用程序的源代碼打包這樣:獲取一個基類的子類的實例
src/
my/
app/
Module.java
ModuleManager.java
module/
ModuleA.java
ModuleB.java
其中Module
是:
public abstract class Module {
public abstract void run();
}
,ModuleA
和ModuleB
延伸Module
:
public class ModuleA extends Module {
@Override
public void run() { /* do something */ }
}
和ModuleManager
有一定的輔助方法,其中一個檢索所有Module
S:
public class ModuleManager {
private final static List<Module> modules;
static {
List<Module> tmp= new ArrayList<Module>();
tmp.add(new ModuleA());
tmp.add(new ModuleB());
modules= Collections.unmodifiableList(tmp);
}
public static List<Module> getModules(){
return modules;
}
}
正如你可以看到我在ModuleManager
手工填寫的模塊列表。相反,我希望它是自動填充Module
的所有子類型的實例模塊包。
我想在幾個方面基於反射的解決方案like this,其涉及使用ClassLoader::getResource(String path)
檢索模塊包內的每個.class文件,但它總是會返回一個空的枚舉。我瞭解到這是由於Dalvik的VM和Java SE的不同之處,以及它在類中的.class文件的優化打包.dex。然後我嘗試從/data/app/與DexClassLoader
或PathClassLoader
導入應用程序的apk,並且再次嘗試了他們的getResource()
方法。無論如何,我認爲這不是正確的方向,可能這個東西在Java中已經是黑客/有缺陷的,而且在Android中會更多。
你能告訴我一種方法嗎?
非常感謝。
謝謝,這是一個好主意! – 2011-03-04 09:52:47