我正在尝试为component-
scan我正在开发的Android框架实施类似于Spring的软件包扫描功能。基本上,我希望能够指定基本包,例如,com.foo.bar并检索Class具有特定批注的所有实例。我不想在我的框架中注册每个组件,因为那样会破坏自动扫描的目的。
根据我的研究,似乎Java无法使用反射来获取给定包名称的资源。但是,我简短地研究了Reflections框架,并且想知道是否存在与Android兼容的等效项。如果没有,也许有一种不太明显的方法可以完成我想做的事情。
我稍微看了一下Spring源代码,看看他们是如何实现这一目标的,但是我认为他们在Dalvik运行时中所做的工作并不可行。
更新资料
目前,以下代码是我能够最好地检索包含特定批注的所有类的方法,但是坦率地说,这是一个非常差的解决方案。它会对ClassLoader扫描(并加载)所有应用程序类的plus
做出一些非常不安全的假设。
public Set> getClassesWithAnnotation(Class extends Annotation> annotation) {
Set> classes = new HashSet>();
Field dexField = PathClassLoader.class.getDeclaredField("mDexs");
dexField.setAccessible(true);
PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader();
DexFile[] dexs = (DexFile[]) dexField.get(classLoader);
for (DexFile dex : dexs) {
Enumeration entries = dex.entries();
while (entries.hasMoreElements()) {
String entry = entries.nextElement();
Class> entryClass = dex.loadClass(entry, classLoader);
if (entryClass != null && entryClass.isAnnotationPresent(annotation)) {
classes.add(entryClass);
}
}
}
return classes;
}