一千萬個為什麽

搜索

有什麽方法可以在運行時使用反射訪問Scala Option聲明的類型?

所以,我有一個看起來像這樣的Scala類:

class TestClass {
  var value: Option[Int] = None
}

我正在解決一個問題,我有一個String值,我想在運行時使用反射將其強制轉換為Option [Int]。所以,在另一段代碼中(對TestClass一無所知)我有一些這樣的代碼:

def setField[A <: Object](target: A, fieldName: String, value: String) {
  val field = target.getClass.getDeclaredField(fieldName)
  val coercedValue = ???;//How do I figure out that this needs to be Option[Int] ? 
  field.set(target, coercedValue)   
}

為此,我需要知道該字段是一個Option,並且Option的type參數是Int。

我可以選擇在運行時(即使用反射)確定'value'的類型是Option [Int]?

我已經看到通過註釋字段解決了類似的問題,例如@OptionType(Int.class)。如果可能的話,我更喜歡一種不需要在反射目標上進行註釋的解決方案。

最佳答案

使用Java 1.5反射API非常直觀:

 def isIntOption(clasz: Class[_], propertyName: String) = {
   var result = 
     for {
       method <- cls.getMethods
       if method.getName==propertyName+"_$eq"
       param <- method.getGenericParameterTypes.toList.asInstanceOf[List[ParameterizedType]]
     } yield
       param.getActualTypeArguments.toList == List(classOf[Integer]) 
       && param.getRawType == classOf[Option[_]]
   if (result.length != 1)
     throw new Exception();
   else
     result(0)
 }

轉載註明原文: 有什麽方法可以在運行時使用反射訪問Scala Option聲明的類型?