通过反射获取在导入类中声明的枚举常量

时间:2013-06-09 15:11:32

标签: java reflection

有类似的东西:

import com.example.test.classA;
import com.example.test.classB;
import com.example.test.classC;

public class MyClass {
    ...
    Flavors p = Flavors.VANILLA;
    ...
    String flavorChoice = "Flavors.CHOCOLATE";
    ...
}

其中Flavors是在其中一个导入的类中声明的enum

public enum Flavors { CHOCOLATE, VANILLA, LEMON };

如何使用字符flavorChoice中的反射来获取值? 不要假设我知道在哪个导入的类Flavors被声明 甚至不要假设Flavors内可以访问MyClass

澄清
字符串flavorChoices应该生成Object,在上面的示例中,对象可以是Flavors类型。但它也可能引用其他枚举中的其他常量:

String flavorChoice = "ExtraFlavors.MENTA";
String flavorChoice = "ExoticFlavors.CHALK";
String flavorChoice = "AnyEmun.ANYCONSTANT";

我不知道字符串内容是什么,直到运行时。我希望能够:

  1. 检查引用的enum indeeed是否存在且可从MyClass
  2. 访问
  3. 获取引用的枚举常量并将其放入Object

2 个答案:

答案 0 :(得分:0)

如果将字符串重新定义如下:

String flavorChoice = "CHOCOLATE";

你甚至不需要反思。只需使用Flavors.valueOf(flavorChoice)

在您的情况下,您可以说:

String choice = "Flavors.CHOCOLATE";
String[] fragments = choice.split("\\."); 
Enum.valueOf(Class.forName(fragments[0]), fragments[1]);

Class.forName(fragments[0])会返回enum的{​​{1}}课程,Enum.valueOf()会返回enum的元素。

编辑: 如果在实际案例中您的类属于包,则应通过将split()替换为其他内容来改进解析。

答案 1 :(得分:0)

如果您可以访问Flavors类,如示例所示,valueOf方法可能很有用:

  

返回具有指定名称的此类型的枚举常量。该字符串必须与用于在此类型中声明枚举常量的标识符完全匹配。 (不允许使用无关的空白字符。)

因此:

Flavor f = Flavors.valueOf("VANILLA");

如果您的问题是如何从VANILLA中提取Flavors.VANILLA,您可以尝试:

Flavor f = Flavors.valueOf("Flavors.VANILLA".replaceAll("^.*\\.", ""));

其中*是一个贪婪的量词。

使用正则表达式优于split("\\.")[1]的优势在于,如果参数具有更高的限定条件,例如classA.Flavors.VANILLAcom.example.test.classA.Flavors.VANILLA,则正则表达式仍然有效。或者,您可以使用:

String[] parts = "Flavors.VANILLA".split("\\.");
String flavorPart = parts[parts.length - 1];