获取Scala/Java中的实例的公共字段(及其各自的值)

sdk*_*ldf 10 reflection scala field

PHP引入了一种方法,允许您选择实例的所有公共值.在Scala有什么办法吗?即获取实例化类(非对象)的所有公共字段的所有值.

让我们假设我有这门课

class TestElement( datatype: Datatype, var subject: String, var day: Int, var time: Int )
  extends DataElement( datatype: Datatype ) {    
   def to( group: Group ) = group.add( this );
}

var element = new TestElement( datatype, "subject", 1, 1 );
Run Code Online (Sandbox Code Playgroud)

我需要的方法是获取一个Map或两个值集合.

var element.method                                       // the function I need
ret: ( ("subject", "subject"), ("day", 1), ("time", 1) ) // its output
Run Code Online (Sandbox Code Playgroud)

Dun*_*gor 21

这是睡觉时间,所以我没有时间为一个完整的答案,而是看结果element.getClass.getFields(或getDeclaredFields私人领域) -你可以调用getValue(element)Field对象来获取它们的值.


现在醒来,仍然没有更好的答案,所以:

首先,请注意,在Java术语中,您的类没有公共字段主题,它具有私有字段主题和访问者方法subject()和subject_ $ eq(String).

您可以如上所述迭代私有字段对象,从对中填充映射:

def getFields(o: Any): Map[String, Any] = {
  val fieldsAsPairs = for (field <- o.getClass.getDeclaredFields) yield {
    field.setAccessible(true)
    (field.getName, field.get(o)) 
  }
  Map(fieldsAsPairs :_*)
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在TestElement上定义此方法(替换othis),或者更通常有用地定义转换,以便您可以在任何引用上调用getFields

implicit def any2FieldValues[A](o: A) = new AnyRef {
  def fieldValues = getFields(o)
}
Run Code Online (Sandbox Code Playgroud)

以便

element.fieldValues 
Run Code Online (Sandbox Code Playgroud)

会得到你想要的结果.