Отражение перечисления Java, когда перечисление находится внутри класса

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

public class FirstClass extends BaseClass {

  public enum EnumGroup {
      ONE("one"),
      TWO("two");

      private String mName;

      EnumGroup(String name) {
        this.mName = name;
      }

      public String getName() {
        return mName;
      }  
  }

  // FirstClass methods
}

Моя цель состоит в том, чтобы программно перебрать эти классы (например, FirstClass, SecondClass и т. д.), вытащить перечисление (всегда называемое «EnumGroup») и вызвать метод getName() для каждого значения перечисления.

Я просмотрел это сообщение StackOverflow. в отражении и перечислениях Java, но когда я пытаюсь получить свое перечисление, указав путь (com.package.FirstClass.EnumGroup), я получаю исключение ClassNotFoundException. Я предполагаю, что размещение перечисления внутри класса что-то испортило.

Class<?> clz = Class.forName("com.package.FirstClass.EnumGroup");

Мне не обязательно нужна эта настройка, но конечная цель состоит в том, чтобы не иметь один и тот же код в каждом классе, который выполняет итерацию по перечислению.


person Mark    schedule 19.10.2015    source источник
comment
Привет @JBNizet - добавлена ​​строка, которая выдает исключение ClassNotFoundException.   -  person Mark    schedule 19.10.2015
comment
Зачем использовать Class.forName()? Почему бы просто не использовать литерал класса com.package.FirstClass.EnumGroup.class? У вас не будет исключения, компилятор проверит, что вы используете допустимое имя класса, и рефакторинг автоматически сделает ваш код правильным.   -  person JB Nizet    schedule 19.10.2015
comment
Могут ли те, кто проголосовал против, объяснить, почему этот вопрос не подходит или не соответствует их стандартам? Спасибо!   -  person Mark    schedule 20.10.2015


Ответы (1)


Поскольку вы используете Class.forName, вам нужно использовать имя класса, а в именах классов внутренние типы отделяются от внешних типов с помощью $.

Так что используйте

Class<?> clz = Class.forName("com.package.FirstClass$EnumGroup");
//                                                  ^
person Pshemo    schedule 19.10.2015
comment
Удивительно быстрый и правильный ответ. Спасибо @Pshemo! :) - person Mark; 19.10.2015