Реализация Spring-подобного сканирования пакетов в Android

Я пытаюсь реализовать функцию сканирования пакетов, аналогичную Springcomponent-scanдля платформы Android, которую я разрабатываю. По сути, я хотел бы иметь возможность указать базовый пакет, например,com.foo.bar и получить всеClass экземпляры, которые имеют конкретную аннотацию. Я не хочу регистрировать каждый компонент в моей платформе, так как это противоречит цели автоматического сканирования.

Основываясь на моих исследованиях, кажется, что с помощью Java невозможно получить ресурсы, используя имя пакета, используя отражение. Тем не менее, я кратко изучилРазмышления рамкии мне интересно, существует ли совместимый с Android эквивалент. Если нет, возможно, есть немного менее очевидный способ выполнить то, что я хочу сделать.

Я немного заглянул в источник Spring, чтобы увидеть, как они достигли этого, но я не думаю, что то, что они делают, сработает в среде выполнения Dalvik.

Update

В настоящее время приведенный ниже код является лучшим, что я могу сделать для извлечения всех классов, которые содержат конкретную аннотацию, но, честно говоря, это довольно плохое решение. Это делает некоторые действительно небезопасные предположения о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;
}

Ответы на вопрос(5)

Ваш ответ на вопрос