我需要创建一个接受同一类的两个对象的函数。一个是更新的对象,另一个是旧对象。我需要通过考虑旧对象来找到更新对象的差异。就像我们在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[] => }
答案 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