Предположим, что исходный код моего приложения для Android упакован следующим образом:
src/
my/
app/
Module.java
ModuleManager.java
module/
ModuleA.java
ModuleB.java
, где Module
:
public abstract class Module {
public abstract void run();
}
, ModuleA
и ModuleB
extends 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
в пакете module .
Я пробовал несколькими способамиРешения на основе отражений , подобные этому , которые включают использование ClassLoader::getResource(String path)
для извлечения каждого файла .class внутри пакета module , но он всегда возвращает пустое перечисление.Я узнал, что это связано с различием между виртуальной машиной Dalvik и Java SE, а также оптимизированной упаковкой файлов .class в classes.dex .Затем я попытался импортировать apk приложения из / data / app / с помощью DexClassLoader
или PathClassLoader
и безуспешно попробовал метод getResource()
снова.Во всяком случае, я думаю, что это не правильное направление, и, возможно, этот материал уже был хакерским / испорченным в Java, и это было бы еще больше в Android.
Не могли бы вы предложить мне способ сделать это?
Большое спасибо.