Получение всех внутренних классов по рефлексии - PullRequest
6 голосов
/ 24 мая 2010

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

    }

Ответы [ 2 ]

8 голосов
/ 24 мая 2010
classList.addAll(Arrays.asList(CompoundReference.class.getDeclaredClasses()));

Я должен заметить, что это небезопасно с точки зрения Обобщения, поскольку метод getDeclaredClasses может возвращать все виды классов, не только подклассы включающего класса, это просто массив Class<?>, так может потребоваться выполнить итерацию и подтверждение / приведение в соответствие с вашим вариантом использования.

0 голосов
/ 24 мая 2010

Class.getDeclaredClasses

Возвращает массив объектов Class, отражающий все классы и интерфейсы, объявленные как члены класса, представленного этим объектом Class.Это включает в себя открытый, защищенный, доступ по умолчанию (пакет), а также частные классы и интерфейсы, объявленные классом, но исключая унаследованные классы и интерфейсы.

Я не уверен, применяется ли последнее исключение к внутреннемуклассы, которые также являются подклассами ... Проверьте это.

Ваш вопрос, кстати, как бы смешивает эти понятия (внутренние классы и подклассы), я надеюсь, вы понимаете, что это ортогональные понятия: я предполагаю, что вы на самом деле заинтересованыв списке всех внутренних классов (которые, в вашем случае, также являются подклассами).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...