在Scala / Java中获取实例的公共字段(及其各自的值)
发布时间:2020-12-16 21:32:28 所属栏目:安全 来源:网络整理
导读:PHP introduces a method that allows you to pick out all public values of an instance.在Scala有没有办法做到这一点?那就是获取实例化类(而不是对象)的所有公共字段的所有值. 让我们假设我有这个班 class TestElement( datatype: Datatype,var subject:
PHP introduces a method that allows you to pick out all public values of an instance.在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 ); 我从所讨论的方法中需要的是获取一个Map或两个值集合. var element.method // the function I need ret: ( ("subject","subject"),("day",1),("time",1) ) // its output 解决方法
现在是睡觉的时候了,所以我没有时间给出完整的答案,但是看看element.getClass.getFields的结果(或者是私有字段的getDeclaredFields) – 你可以在Field对象上调用getValue(element)来获取它们值.
现在醒来,还是没有更好的答案,所以: 首先,请注意,在Java术语中,您的类没有公共字段主题,它是一个私有字段主题和访问器方法subject()和subject_ $eq(String). 您可以如上所述迭代私有字段对象,从对象中填充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),或者更通常地有用地定义转换,以便您可以在任何引用上调用getField implicit def any2FieldValues[A](o: A) = new AnyRef { def fieldValues = getFields(o) } 以便 element.fieldValues 会给你想要的结果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |