有类似的东西:
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";
我不知道字符串内容是什么,直到运行时。我希望能够:
Object
答案 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.VANILLA
或com.example.test.classA.Flavors.VANILLA
,则正则表达式仍然有效。或者,您可以使用:
String[] parts = "Flavors.VANILLA".split("\\.");
String flavorPart = parts[parts.length - 1];