Есть ли способ получить список InnerClasses через Reflection в Java? - PullRequest
4 голосов
/ 02 мая 2010

Есть ли способ узнать внутренние классы класса через Reflection в Java?

Ответы [ 3 ]

6 голосов
/ 02 мая 2010

Да, используйте для этого Class#getDeclaredClasses(). Вам нужно только определить, является ли это внутренний класс или вложенный (статический) класс, проверив его модификаторы. Предполагая, что Parent является родительским классом, вот следующий пример:

for (Class<?> cls : Parent.class.getDeclaredClasses()) {
    if (!Modifier.isStatic(cls.getModifiers())) {
        // This is an inner class. Do your thing here.
    } else {
        // This is a nested class. Not sure if you're interested in this.
    }
}

Примечание: это относится не только к анонимным классам, но, учитывая ваш предыдущий вопрос по этой теме, я не думаю, что вы их явно просите. *

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

Да, для этого есть хитрость. Смотрите старый пост о поиске ресурсов . Зная свой класс (скажем, com.domain.api.ClassA), извлеките имя пакета, преобразуйте пакет в путь (замените '.' На '/', и вы получите com / domain / api) сканируйте все файлы с помощью расширение .class в этой папке и сохранить только те файлы, которые начинаются с вашего имени класса (ClassA $ xxxxx), это внутренние классы для класса ClassA

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

Нет, к сожалению, по той же причине, по которой вы не можете перечислять обычные классы в пакете.

Внутренние классы - это действительно обычные классы во время выполнения. Компилятор вносит некоторые изменения, чтобы обойти обычные правила доступа. Например, внутренний класс, кажется, может получить доступ к закрытым полям и методам включающего класса - он может сделать это, потому что компилятор создает не закрытую функцию доступа, которая является используется внутренним классом. Подробнее см. Java в двух словах - как работают внутренние классы .

Внутренние классы - это обычные классы, и они не могут быть надежно перечислены, поэтому общий ответ - нет, невозможно.

Однако, это может быть решено в определенных случаях. Если вам известны используемые вами JAR-файлы, вы можете выполнить итерацию по всем файлам в JAR-файле, ища файлы шаблона yourpakage.YourClass$<something>.class, где <something> - один или несколько символов.

EDIT: Существуют различные типы внутреннего класса:

  1. объявленные члены, такие как интерфейсы и классы
  2. Анонимные классы и локальные классы

Если вас волнует только первый случай, то ответ BalusC с использованием getDeclaredClasses является правильным. Если вы хотите все внутренние классы, то, к сожалению, getDeclaredClasses не сработает. См. SDN Bug 4191731 . В этом случае вы можете попробовать один из методов перечисления классов, предложенных в ссылке (например, сканирование файла JAR.)

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