2010-05-24 16 views
6

Ho il seguente problema. Ho questa bella classe e ora voglio ottenere tutte le classi che estendono quella classe (classi interne) e riempire 'classList' con essa. (In modo automatico, naturalmente)Ottenere tutte le classi interne per riflessione

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 

qualche soluzione manuale sarebbe solo per un blocco principale come statica, che è qualcosa che non voglio fare.

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

    } 

risposta

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

Vorrei sottolineare che questo non è sicuro dal punto di vista Generics, dato che il metodo getDeclaredClasses può restituire tutti i tipi di classi, non solo sublcasses della classe contenitrice, è solo un array di Class<?>, quindi potrebbe essere necessario iterare e confermare/trasmettere secondo necessità per il tuo caso d'uso.

+0

Ottimo, è stato facile .. :-) – Roman

+0

Ciò richiamerebbe anche le classi interne che non estendono esplicitamente CompoundReference, vero? – Quotidian

+0

Sì, ma non importa, non ho altre classi interne lì, quindi sono bravo con quello – Roman

0

Class.getDeclaredClasses

restituisce un array di classe oggetti riflette tutte le classi e le interfacce dichiarati come membri della classe rappresentato da questa classe oggetto . Questo include pubblico, protetto, accesso predefinito (pacchetto), e classi private e interfacce dichiarate dalla classe, ma esclude le classi e le interfacce ereditate da .

Non sono sicuro che l'ultima esclusione si applichi alle classi interne che sono anche sottoclassi ... Verifica.

La tua domanda, in qualche modo, mescola questi concetti (classi interne e sottoclassi), spero tu capisca che quelli sono concetti ortogonali: presumo che tu sia realmente interessato a elencare tutte le classi interne (che, nel tuo caso, capita di essere anche sottoclassi).

Problemi correlati