加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在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

会给你想要的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读