Wdrażanie skanowania pakietów w stylu wiosny w systemie Android

Próbuję zaimplementować funkcję skanowania pakietów, podobną do funkcji Springacomponent-scan, dla frameworka Androida, który tworzę. Zasadniczo chciałbym móc określić pakiet podstawowy, np.com.foo.bar i odzyskaj wszystkoClass instancje, które mają określoną adnotację. Nie chcę rejestrować każdego komponentu za pomocą mojego szkieletu, ponieważ to zniweczyłoby cel automatycznego skanowania.

W oparciu o moje badania wydaje się, że w Javie nie jest możliwe pobieranie zasobów przy użyciu nazwy pakietu przy użyciu refleksji. Jednak krótko przyjrzałem sięRamy refleksjii zastanawiam się, czy istnieje odpowiednik kompatybilny z Androidem. Jeśli nie, być może istnieje nieco mniej oczywisty sposób na osiągnięcie tego, co chcę zrobić.

Zajrzałem trochę do źródła Springa, aby zobaczyć, jak to osiągnęli, ale nie sądzę, aby to, co robią, działało w środowisku wykonawczym Dalvik.

Aktualizacja

Obecnie poniższy kod jest najlepszym, co mogę zrobić, aby pobrać wszystkie klasy, które zawierają konkretną adnotację, ale szczerze mówiąc jest to dość słabe rozwiązanie. To sprawia, że ​​niektóre naprawdę niebezpieczne założenia na tematClassLoader plus skanuje (i ładuje) wszystkie klasy aplikacji.

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

questionAnswers(5)

yourAnswerToTheQuestion