【发布时间】:2012-07-10 20:06:21
【问题描述】:
我正在尝试为我正在开发的 Android 框架实现包扫描功能,类似于 Spring 的component-scan。基本上,我希望能够指定一个基本包,例如com.foo.bar 并检索具有特定注释的所有 Class 实例。我不想在我的框架中注册每个组件,因为这会破坏自动扫描的目的。
根据我的研究,Java 似乎无法使用反射检索给定包名称的资源。但是,我简要查看了Reflections framework,我想知道是否有与 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;
}
【问题讨论】:
标签: java android spring reflection dalvik