私は複雑なリフレクションベースの 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 に設定できません」という例外が発生します (これは妥当です)。