component-scan
我正在尝试为我正在开发的 Android 框架实现类似于 Spring 的包扫描功能。基本上,我希望能够指定一个基本包,例如com.foo.bar
并检索所有Class
具有特定注释的实例。我不想在我的框架中注册每个组件,因为这会破坏自动扫描的目的。
根据我的研究,Java 似乎无法使用反射检索给定包名称的资源。但是,我简要研究了反射框架,我想知道是否有与 Android 兼容的等价物。如果没有,也许有一种不太明显的方法来完成我想做的事情。
我稍微研究了 Spring 源代码,看看他们是如何实现这一点的,但我认为他们所做的事情不会在 Dalvik 运行时中起作用。
更新
目前,下面的代码是我能做的最好的检索所有包含特定注释的类,但坦率地说,这是一个非常糟糕的解决方案。ClassLoader
它对扫描(和加载)所有应用程序类的加号做了一些非常不安全的假设。
public Set<Class<?>> getClassesWithAnnotation(Class<? extends Annotation> annotation) {
Set<Class<?>> classes = new HashSet<Class<?>>();
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<String> 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;
}