1

有类似的东西:

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. 检查引用的枚举确实存在并且可以从 MyClass 访问
  2. 获取引用的枚举常量并将其放入Object
4

2 回答 2

0

如果您有权访问Flavors该类,如示例所建议的,则该valueOf方法可能很有用:

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

因此:

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

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

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

哪里*是一个贪心量词。

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

String[] parts = "Flavors.VANILLA".split("\\.");
String flavorPart = parts[parts.length - 1];
于 2013-06-09T15:21:59.313 回答
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的类,Enum.valueOf()返回enum.

编辑:如果在现实世界中你的类属于包,你应该通过替换split()为其他东西来改进解析。

于 2013-06-09T15:17:26.593 回答