2

私は複雑なリフレクションベースの Java アプリケーションを持っていますが、これを部分的にスカラに変換しました。ただし、リフレクションベースの部分はまだ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());
    }

  ...

少なくとも型認識は正しく機能しますが、2 つの疑問が残ります。1. 名前を介さずに型を認識する方法はありますか? if (type == Enumeration.class) が機能しない場合、if (type == Enumeration) も機能しない場合 (2 番目のソリューションはコンパイルさえしません) 2. 値を設定する方法は? 「???」の置き換え方 単純に field.set(o, value) を実行すると、「scala.Enumeration$Value フィールド diva.module.AdaptationFloodingNew.adaptMode を java.lang.String に設定できません」という例外が発生します (これは妥当です)。

4

1 に答える 1