繁体   English   中英

如何使用Java-Reflection设置scala.Enumeration类型的值

[英]How to use Java-Reflection to set the value of type scala.Enumeration

我有一个复杂的基于反射的Java应用程序,现在将其部分翻译为scala。 但是,基于反射的部分仍在Java中...

现在,我有一个scala枚举类型,例如:

object DayType extends Enumeration {
  type DayType = Value

  val Monday = Value("Monday")
  val Tuesday = Value("Tuesday")
  ...
}

现在,我通过以下方式使用Java Reflection:

public static void setFieldValue(Object o, String fieldName, String value) {

  Field field;
  try {
    field = o.getClass().getField(fieldName);
  } catch (NoSuchFieldException e) {
    // in Scala EVERY field is private.
    field = o.getClass().getDeclaredField(fieldName);
    field.setAccessible(true);
  }

  Class type = field.getType();
  if (type == Float.TYPE) {
    field.setFloat(o, Float.parseFloat(value));
  } 
  if (type == Integer.TYPE) {
    field.setInt(o, Integer.parseInt(value));
  }

  ...

  if (type.getName().equals("scala.Enumeration$Value")) {
    System.out.println("fieldname: " + field.getName());
    System.out.println("fieldtype: " + field.getType());
    try {
      field.set(o, ???);
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }

  ...

至少类型识别可以正常工作,但是,还有两个问题:1.是否有一种无需通过名称即可识别类型的方法? if(type == Enumeration.class)不起作用,if(type == Enumeration)也不起作用(第二个解决方案甚至无法编译)2.如何设置值? 如何替换“ ???” 简单地执行field.set(o,value)会导致“无法将scala.Enumeration $ Value字段diva.module.AdaptationFloodingNew.adaptMode设置为java.lang.String”(这是合理的)。

代码中缺少的是一种将值从字符串转换为DayType的方法。 有点像处理整数的方式... Integer.parseInt(value)。 尝试使用DayType枚举中使用的Value构造。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM