Scala Reflection获取对象的所有字段的类型

时间:2018-02-20 09:59:49

标签: scala reflection

我需要创建一个接受同一类的两个对象的函数。一个是更新的对象,另一个是旧对象。我需要通过考虑旧对象来找到更新对象的差异。就像我们在java中使用getDeclaredFields方法来获取所有变量一样。我正在寻找一种方法来获取一个对象的所有字段,然后我必须逐个迭代并根据其类型我必须检查等于两个对象。

//来自评论的代码:

def trackChanges(newRecord:Object,oldRecord:Object) :String = { 
  val fields :Array[Field] = newRecord.getClass.getDeclaredFields 
  var check : String = "Equal" 
  for( i <- 0 to fields.length-1) { 
    fields(i).setAccessible(true) 
    val fieldType:Object = fields(i).getType 
    fieldType match { 
      case x: String => fields(i).get(newRecord).equals(fields(i).get(oldRecord)) 
      case x: java.lang.Double => println("String") 
      case x: Seq[] => println("String") 
      case x: List[] => }

3 个答案:

答案 0 :(得分:0)

所以你有一些对象:

scala> trait MyTrait {
     | val x: String
     | val y: Int
     | }
defined trait MyTrait

scala> object MyObjectA extends MyTrait {
     | val x = "priyam"
     | val y = 1
     | }
defined object MyObjectA

scala> object MyObjectB extends MyTrait {
     | val x = "singh"
     | val y = 2
     | }
defined object MyObjectB

scala> object MyObjectC extends MyTrait {
     | val x = "priyam"
     | val y = 1
     | }
defined object MyObjectC

由于无法比较两个对象,因此可以从对象中创建case class。这会给你一个免费的比较器:

scala> def createFromObject(obj: MyTrait): MyCaseClass = MyCaseClass(obj.x, obj.y)
createFromObject: (obj: MyTrait)MyCaseClass

现在,您要比较对象:

scala> createFromObject(MyObjectA) == createFromObject(MyObjectC)
res5: Boolean = true

scala> createFromObject(MyObjectA) == createFromObject(MyObjectB)
res6: Boolean = false

您还可以从原始对象或案例类调用个人成员:

scala> MyObjectA.x
res7: String = priyam

scala> createFromObject(MyObjectA).a
res8: String = priyam

答案 1 :(得分:0)

想法1。 不要在运行时使用反射。反射是一种沉重而缓慢的机制,因此使用它来跟踪对象的变化可能会破坏解决方案的所有性能。我建议您直接为每个字段手动编写。它会很快。

if (obj1.field != obj2.field) {}

想法2。 但我认为你的意思是自己是一个优秀的程序员,你担心未来的代码维护,我假设你是懒得手工编写它。所以。因为scala在JVM上运行,所以java-reflection也可以在这里使用。你可以自由使用getDeclaredFields。 如果您想使用scala反射,可以在此处看到:https://github.com/yudnikov/transactions/blob/master/src/main/scala/ru/yudnikov/meta/describing/Reflector.scala - 这是scala反射使用的示例。注意

def getTerms(...)

你需要了解什么是运行时镜像......

想法3。 这个问题的真正程序员解决方案是在编译时使用带有反射的scala宏来自动生成Idea№1的低级轻量级代码。但我无法帮助你。祝你好运;)

答案 2 :(得分:-1)

-Dspring.profiles.active=test   jvm argument