簡體   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