2011-10-02 10 views
5

Quiero escanear el classpath para ciertas anotaciones en Android.¿es posible escanear el classpath de android para anotaciones?

sólo he encontrado una solución a este problema: http://mindtherobot.com/blog/737/android-hacks-scan-android-classpath/

Y como el autor escribe que funciona esta solución, pero tiene varias limitaciones. ¿Hay alguna forma de hacerlo a prueba del futuro en Android? Cualquier biblioteca que proporciona esta funcionalidad?

+0

me gustaría ver esta pregunta respondió. Estoy tratando de resolver el mismo problema. El marco de análisis de anotaciones que he utilizado en el pasado es Reflections (http://code.google.com/p/reflections/), pero no puedo entender cómo "señalarlo" correctamente en el código compilado. base ... – Andrey

+0

Solo puedo pensar en permitir que Reflections analice las anotaciones en tiempo de compilación y genere un archivo XML con esa información (que de hecho, admite) y luego cargue toda la información de ese archivo en tiempo de ejecución (ver al final de la página del proyecto y http://code.google.com/p/reflections/wiki/ReflectionsMojo para más detalles) – Andrey

Respuesta

1

Esto funciona para mí usando androide 3,0

public static <T extends Annotation> List<Class> getClassesAnnotatedWith(Class<T> theAnnotation){ 

    // In theory, the class loader is not required to be a PathClassLoader 
    PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader(); 
    Field field = null; 
    ArrayList<Class> candidates = new ArrayList<Class>(); 

    try { 
     field = PathClassLoader.class.getDeclaredField("mDexs"); 
     field.setAccessible(true); 
    } catch (Exception e) { 
     // nobody promised that this field will always be there 
     Log.e(TAG, "Failed to get mDexs field", e); 
    } 

    DexFile[] dexFile = null; 
    try { 
     dexFile = (DexFile[]) field.get(classLoader); 
    } catch (Exception e) { 
     Log.e(TAG, "Failed to get DexFile", e); 
    } 

    for (DexFile dex : dexFile) { 
     Enumeration<String> entries = dex.entries(); 
     while (entries.hasMoreElements()) { 
     // Each entry is a class name, like "foo.bar.MyClass" 
     String entry = entries.nextElement(); 

     // Load the class 
     Class<?> entryClass = dex.loadClass(entry, classLoader); 
     if (entryClass != null && entryClass.getAnnotation(theAnnotation) != null) { 
      Log.d(TAG, "Found: " + entryClass.getName()); 
      candidates.add(entryClass); 
     } 
     } 
    } 

    return candidates; 
}  

También creé una a determin si una clase se deriva de X

public static List<Class> getClassesSuperclassedOf(Class theClass){ 

    // In theory, the class loader is not required to be a PathClassLoader 
    PathClassLoader classLoader = (PathClassLoader) Thread.currentThread().getContextClassLoader(); 
    Field field = null; 
    ArrayList<Class> candidates = new ArrayList<Class>(); 

    try { 
     field = PathClassLoader.class.getDeclaredField("mDexs"); 
     field.setAccessible(true); 
    } catch (Exception e) { 
     // nobody promised that this field will always be there 
     Log.e(TAG, "Failed to get mDexs field", e); 
    } 

    DexFile[] dexFile = null; 
    try { 
     dexFile = (DexFile[]) field.get(classLoader); 
    } catch (Exception e) { 
     Log.e(TAG, "Failed to get DexFile", e); 
    } 

    for (DexFile dex : dexFile) { 
     Enumeration<String> entries = dex.entries(); 
     while (entries.hasMoreElements()) { 
     // Each entry is a class name, like "foo.bar.MyClass" 
     String entry = entries.nextElement(); 

     // Load the class 
     Class<?> entryClass = dex.loadClass(entry, classLoader); 
     if (entryClass != null && entryClass.getSuperclass() == theClass) { 
      Log.d(TAG, "Found: " + entryClass.getName()); 
      candidates.add(entryClass); 
     } 
     } 
    } 

    return candidates; 
} 

disfrutan - B

+0

Como habrás notado, este es básicamente el mismo código que agregué en el enlace. Lo estoy usando y parece funcionar, pero es muy experimental. De todos modos, gracias por la respuesta (y aunque parece funcionar bien) no es la solución ideal que estaba buscando. –

Cuestiones relacionadas