PHP introduces a method that allows you to pick out all public values of an instance. Scala 有什么办法可以做到这一点吗?即获取实例化类(而不是对象)的所有公共(public)字段的所有值。
让我们假设我有这个类(class)
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 );
我需要从相关方法中获取一个映射或两个值集合。
var element.method // the function I need
ret: ( ("subject", "subject"), ("day", 1), ("time", 1) ) // its output
最佳答案
该 sleep 了,所以我没有时间给出完整的答案,但看看 element.getClass.getFields
(或 getDeclaredFields
for private)的结果fields) - 您可以在 Field
对象上调用 getValue(element)
来获取它们的值。
现在醒来,仍然没有更好的答案,所以:
首先,请注意,用 Java 术语来说,您的类没有公共(public)字段主题,它有一个私有(private)字段主题和访问器方法 subject() 和 subject_$eq(String)。
您可以如上所述迭代私有(private)字段对象,从对中填充 Map:
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 :_*)
}
现在,您可以在 TestElement 上定义此方法(将 o
替换为 this
),或者更普遍地定义一个转换,以便您可以在任何引用上调用 getFields
implicit def any2FieldValues[A](o: A) = new AnyRef {
def fieldValues = getFields(o)
}
所以
element.fieldValues
将给出您想要的结果。
关于scala - 在 Scala/Java 中获取实例的公共(public)字段(及其各自的值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7457972/