你好,我想在scala中创建一个通用包装器,以便跟踪任何类型值的变化。我不知道/到目前为止还没有找到任何其他的方法,我正在考虑创建一个类,我一直在尝试使用动态,但它有一些限制。
case class Wrapper[T](value: T) extends Dynamic {
private val valueClass = value.getClass
def applyDynamic(id: String)(parameters: Any*) = {
val objectParameters = parameters map (x => x.asInstanceOf[Object])
val parameterClasses = objectParameters map (_.getClass)
val method = valueClass.getMethod(id, parameterClasses:_*)
val res = method.invoke(value, objectParameters:_*)
// TODO: Logic that will eventually create some kind of event about the method invoked.
new Wrapper(res)
}
}
使用这段代码,我在两个整数上调用加("+")方法时遇到了麻烦,我不明白为什么。难道没有一个"+"字吗?方法在Int类?当我尝试使用Wrapper/Int类型进行加法时,我得到的错误是:
var wrapped1 = Wrapper(1)
wrapped1 = wrapped1 + Wrapper[2] // or just 2
type mismatch;
found : Wrapper[Int]/Int
required: String
为什么它需要一个字符串?
如果可能的话,能够无缝地使用Wrapper[T]和T方法也会很好,例如
val a = Wrapper[Int](1)
val b = Wrapper[Int](2)
val c = 3
a + b // Wrapper[Int].+(Wrapper[Int])
a + c // Wrapper[Int].+(Int)
c + a // Int.+(Wrapper[Int])
好吧,如果你想让一个代理,将你孩子的期望值的任何变化可能失败没有代理(https://dzone.com/articles/java-agent-1),因为它将迫使你进行代码修改字节码,接受最终接受你的代理类和原语相反,它需要拦截的变化多,只是class"还要对各类成员进行生产价值来源分析等。这可不是个小问题。
另一种方法是通过在某些执行点比较类来产生case类的差异,并且有类似的通用实现,它使用派生来计算差异:https://github.com/ivan71kmayshan27/ShapelesDerivationExample我相信您可以使用magnolia找到更容易的解决方案。实际上,除非你编写自己的宏,并且在有序和无序集合方面有一些问题,否则这个方法无法仅用于类。