我有一个复杂的基于反射的 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”异常(这是合理的)。