Implementando el escaneo de paquetes tipo Spring en Android

Estoy intentando implementar una función de escaneo de paquetes, similar a la de Springcomponent-scan, para el framework Android que estoy desarrollando. Básicamente, me gustaría poder especificar un paquete base, por ejemplo.com.foo.bar y recuperar todoClass Instancias que tienen una anotación particular. No quiero tener que registrar todos los componentes en mi marco, ya que esto anularía el propósito del escaneo automático.

Según mi investigación, parece que con Java no es posible recuperar recursos dado un nombre de paquete mediante la reflexión. Sin embargo, miré brevemente en elMarco de reflexiones, y me pregunto si hay un equivalente compatible con Android. Si no, tal vez haya una manera menos obvia de lograr lo que quiero hacer.

Revisé un poco la fuente de Spring para ver cómo lograron esto, pero no creo que lo que están haciendo funcionaría dentro del tiempo de ejecución de Dalvik.

Actualizar

Actualmente, el siguiente código ha sido lo mejor que puedo hacer para recuperar todas las clases que contienen una anotación específica, pero francamente es una solución bastante mala. Hace algunas suposiciones realmente inseguras sobre elClassLoader además escanea (y carga) todas las clases de aplicaciones.

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;
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta