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上定义此方法(替换o为this),或者更通常有用地定义转换,以便您可以在任何引用上调用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)
会得到你想要的结果.
| 归档时间: |
|
| 查看次数: |
6921 次 |
| 最近记录: |