Implementieren des Spring-ähnlichen Paketscannens in Android

Ich versuche, eine Funktion zum Scannen von Paketen zu implementieren, die Spring ähneltcomponent-scan, für das Android Framework, das ich entwickle. Grundsätzlich möchte ich in der Lage sein, ein Basispaket anzugeben, z.com.foo.bar und alle abrufenClass Instanzen mit einer bestimmten Anmerkung. Ich möchte nicht jede Komponente in meinem Framework registrieren müssen, da dies den Zweck des automatischen Scannens zunichte macht.

Basierend auf meinen Recherchen scheint es mit Java nicht möglich zu sein, Ressourcen, denen ein Paketname zugewiesen wurde, mithilfe von Reflection abzurufen. Ich schaute jedoch kurz in dieReflexionen Rahmen, und ich frage mich, ob es ein Android-kompatibles Äquivalent gibt. Wenn nicht, gibt es vielleicht einen etwas weniger offensichtlichen Weg, um das zu erreichen, was ich tun möchte.

Ich habe ein bisschen in die Quelle von Spring geschaut, um zu sehen, wie sie dies erreicht haben, aber ich glaube nicht, dass das, was sie tun, innerhalb der Dalvik-Laufzeit funktionieren würde.

Aktualisieren

Gegenwärtig ist der folgende Code das Beste, was ich tun kann, um alle Klassen abzurufen, die eine bestimmte Anmerkung enthalten, aber ehrlich gesagt ist es eine ziemlich schlechte Lösung. Es macht einige wirklich unsichere Annahmen über dieClassLoader Außerdem werden alle Anwendungsklassen gescannt (und geladen).

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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage