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

标签 scala reflection field

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/

相关文章:

regex - 使用 RegexParsers 解析空格

java - Scala 宏和 JVM 的方法大小限制

java - Field.getGenericType() 返回 java.lang.Class 的实例而不是 Type

c# - 如何获取UWP中Content属性的名称?

sql - Informix SQL - 列出所有字段和表

在 MongoDB 中搜索任何字段的值而不显式命名它

scala - 惯用的 scala 处理文件 A 或文件 B?

scala - 在不关闭系统本身的情况下停止系统中的所有参与者?

.net - .NET-使用变量打印堆栈跟踪

java - Java中如何为继承字段赋值?