2

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

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

object DayType extends Enumeration {
  type DayType = Value

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

现在我通过以下方式使用 Java 反射:

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”异常(这是合理的)。

4

1 回答 1

0

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

于 2013-07-02T16:13:48.900 回答