假设我有我的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