LINUX.ORG.RU

[Java, RTTI] String to Enum


0

1

День добрый. Подскажите, пожалуйста, как решить следующую проблему.

MyEnum myEnumField;
String enumValue = "FOO"; // FOO -- одно из значений MyEnum.

/* Как сделать следующее динамически, чтобы работало с любой enum-переменной принимающей значение FOO. Имея при этом только строковое название енума ("MyEnum") и строковое представление конкретно значения ("FOO"). */
myEnumField = MyEnum.FOO;
Не уверен что доступно объяснил...

★★★★★

Ответ на: комментарий от Amp

Попытаюсь еще объяснить.
Есть строковое енум-значение и также строковое имя енум-класса. Нужно имея эту информацию установить свойство (естественно имеющее тип этого самого енума) в каком-то левом объекте.

urxvt ★★★★★
() автор топика
Ответ на: комментарий от vertexua

> Или какая у тебя версия жабы
6-я

почему не пользуешься MyEnum.valueOf(«FOO»)?

Дело в том что в этом коде жестко закодирован тип, — MyEnum.
А мне нужно чтобы он подставлялся динамически.

urxvt ★★★★★
() автор топика
Ответ на: комментарий от urxvt

> Есть строковое енум-значение и также строковое имя енум-класса. Нужно имея эту информацию установить свойство (естественно имеющее тип этого самого енума) в каком-то левом объекте.

Если известен тип енума, то зачем сдалось «строковое имя енум-класса»?

Amp ★★★
()
Ответ на: комментарий от urxvt

Тогда нужно уточнить где может быть этот Enum. Дело в том, что только в контексте текущего кода это MyEnum, но он также лежит в каком-то пакете, а может быть и вложен в класс. В Java можно сканировать классы на предмет нахождения вложенных классов.

Class[] c = Main.class.getClasses();
		
		for (Class i: c)
			if (i.isEnum())
				System.out.println(i.toString());

И еще это можно делать рекурсивно. Но все равно уточнить в какой области проводить сканирование надо.

Отвлеченные совет: не сканируй никогда заново, нашел что хотел - сохрани в хеш таблицу.

vertexua ★★★★★
()

Если есть имя пакета, где должен лежать этот Enum (одного имени класса недостаточно), то получаешь класс этого енума с помощью Class.forName. Далее получаешь метод valueOf с помощью getMethod. Далее вызываешь его с нужным значением. Как то так:

Class<?> enumClass = Class.forName("my.enum.MyEnum");
Method valueOfMethod = enumClass.getMethod("valueOf");
Object fooValue = valueOfMethod.invoke(null, "FOO");

Но всё это неправильно, и является признаком кривого дизайна.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

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

@MessageProcessor
public void process(MyMessage1 msg){}

@MessageProcessor
public void process(OtherMessage msg){}
vertexua ★★★★★
()
Ответ на: комментарий от Legioner

Спасибо всем за помощь. Решил с помощью следующего кода:

JoinMethod j = Enum.valueOf(enumClass, "FOO");

Но всё это неправильно, и является признаком кривого дизайна.

Все это нужно для реализации поиска. Со стороны клиента все передается в стоках.

urxvt ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.