2010-05-24 22 views
6

Tengo el siguiente problema. Tengo esta bonita clase y ahora quiero obtener todas las clases que extienden esa clase (clases internas) y rellenar 'classList' con ella. (De forma automática por supuesto)Obteniendo todas las clases internas por reflexión

public abstract class CompoundReference { 

    private static List<Class<? extends CompoundReference>> classList 
      = new ArrayList<Class<? extends CompoundReference>>(); 


    @CompoundKey(gsType = User.class, dbType = UserDetailsMappings.class) 
    public static class CUser extends CompoundReference { 
    } 

    @CompoundKey(gsType = Catalog.class, dbType = CatalogDetailsMappings.class) 
    public static class CCatalog extends CompoundReference { 
    } 

    @CompoundKey(gsType = Product.class, dbType = ProductDetailsMappings.class) 
    public static class CProduct extends CompoundReference { 
    } 

    @CompoundKey(gsType = Category.class) 
    public static class CCategory extends CompoundReference { 
    } 

    @CompoundKey(gsType = Poll.class, dbType = PollDetailsMappings.class) 
    public static class CPoll extends CompoundReference { 
    } 
    // much mroe inner classes 

alguna solución manual sería sólo para un bloque principal de manera estática, que es algo que no quiero hacer.

static { 
     classList.addAll(Arrays.asList(CUser.class, CCatalog.class, 
       CProduct.class, CCategory.class, 
       CPoll.class, CComment.class, CWebPage.class, 
       CReview.class, CPost.class, CMessage.class, CStory.class,CPicture.class)); 

    } 

Respuesta

8
classList.addAll(Arrays.asList(CompoundReference.class.getDeclaredClasses())); 

Debo señalar que esto no es seguro desde el punto de vista de los genéricos, ya que el método getDeclaredClasses puede volver todo tipo de clases, no sólo sublcasses de la clase envolvente, es simplemente una matriz de Class<?>, por lo que es posible que necesite repetir y confirmar/castear según sea necesario para su caso de uso.

+0

Genial, eso fue fácil ... :-) – Roman

+0

Esto también recuperaría clases internas que no extienden explícitamente CompoundReference, ¿o no? – Quotidian

+0

Sí, pero no importa, no tengo otras clases internas allí, así que estoy bien con ese – Roman

0

Class.getDeclaredClasses

Devuelve un conjunto de objetos Clase que refleja todas las clases y interfaces declaradas como miembros de la clase representado por este objeto Class . Esto incluye público, protegido, acceso predeterminado (paquete), y clases e interfaces privadas declaradas por la clase, pero excluye clases heredadas e interfaces.

no estoy seguro de si la última exclusión se aplica a las clases internas que también son subclasess ... comprobarlo.

Su pregunta, por cierto, mezcla esos conceptos (clases internas y subclases), espero que comprenda que esos son conceptos ortogonales: supongo que en realidad está interesado en enumerar todas las clases internas (que, en su caso, pasan a ser también subclases).

Cuestiones relacionadas