Java:使用反射实例化枚举 [英] Java: instantiating an enum using reflection

查看:1131
本文介绍了Java:使用反射实例化枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设你有一个文本文件,如:

Suppose you have a text file like:

my_setting = ON
some_method = METHOD_A
verbosity = DEBUG
...

您要相应地更新相应的对象:

That you wish to to update a corresponding object accordingly:

Setting my_setting = ON;
Method some_method = METHOD_A;
Verbosity verbosity = DEBUG;
...

哪里都是不同类型的枚举。

Where all are different kind of enums.

我想有一个通用的方法来实例化枚举值。也就是说,在运行时使用反射,并且事先不知道对象的枚举类型。

I would like to have a generic way to instantiate the enum values. That is, at runtime using reflection, and without knowing the enum types of the object in advance.

我会想到这样的东西:

for (ConfigLine line : lines)
{
   String[] tokens = line.string.split("=", 2);
   String name = tokens[0].trim();
   String value = tokens[1].trim();

   try
   {
      Field field = this.getClass().getDeclaredField(name);   
      if(field.getType().isEnum())
      {
         // doesn't work (cannot convert String to enum)
         field.set(this, value);
         // invalid code (some strange generics issue)
         field.set(this, Enum.valueOf(field.getType().getClass(), value));
      }
      else
      { /*...*/ }
   }
   catch //...
}

问题是:应该有什么?它是否可能实例化一个未知的枚举给它的String表示?

The question is: what should there be instead? Is it even possible to instantiate an unknown enum given its String representation?

推荐答案

field.set(this, Enum.valueOf((Class<Enum>) field.getType(), value));




  • getClass() after getType()不应该被调用 - 它返回一个类的类实例

  • 您可以转换类< Enum> ,以避免泛型问题,因为您已经知道 Class 是一个枚举

    • getClass() after getType() should not be called - it returns the class of a Class instance
    • You can cast Class<Enum>, to avoid generic problems, because you already know that the Class is an enum
    • 这篇关于Java:使用反射实例化枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆