2010-05-24 84 views
6

我有以下问题。我有这个漂亮的类,现在我想要得到所有扩展该类的类(内部类)并用它填充'classList'。 (当然在自动方式)通过反射获取所有内部类

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 

一些手动解决方案将只是主要的静态块,那是什么,我不想做的事。

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

    } 

回答

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

我要指出,这是不是安全的从一个泛型点,因为getDeclaredClasses方法可以返回各种类,而不仅仅是封装类的sublcasses,它只是一个数组Class<?>,所以你可能需要迭代和确认/施放你的用例需要。

+0

好极了,那很简单。:-) – Roman 2010-05-24 18:20:11

+0

这也会检索内部类,它们没有明确地扩展CompoundReference,不是吗? – Quotidian 2010-05-24 18:22:33

+0

是的,但没关系,我没有任何其他的内部类,所以我很喜欢那个 – Roman 2010-05-24 18:26:26

0

Class.getDeclaredClasses

返回Class对象的数组 反映声明该Class 对象所表示的 类的成员的所有类和 接口。这包括公共, 受保护的,默认(包)访问, 和类声明的私有类和接口 ,但不包括 继承的类和接口。

我不确定最后的排除是否适用于也是子类型的内部类... 检查它。我希望你明白那些是正交的概念:我假设你真的有兴趣列出所有的内部类(就你的情况而言,碰巧也是子类)。

相关问题