Dynamic Proxy using Scalas new Dynamic Type

岁酱吖の 提交于 2019-12-21 12:31:54

问题


Is it possible to create an AOP like interceptor using Scalas new Dynamic Type feature? For example: Would it be possible to create a generic stopwatch interceptor that could be mixed in with arbitrary types to profile my code? Or would I still have to use AspectJ?


回答1:


I'm pretty sure Dynamic is only used when the object you're selecting on doesn't already have what you're selecting:

From the nightly scaladoc:

Instances x of this trait allow calls x.meth(args) for arbitrary method names meth and argument lists args. If a call is not natively supported by x, it is rewritten to x.invokeDynamic("meth", args)

Note that since the documentation was written, the method has been renamed applyDynamic.




回答2:


No.

In order for a dynamic object to be supplied as a parameter, it'll need to have the expected type - which means inheriting from the class you want to proxy, or from the appropriate superclass / interface.

As soon as you do this, it'll have the relevant methods statically provided, so applyDynamic would never be considered.




回答3:


I think your odds are bad. Scala will call applyDynamic only if there is no static match on the method call:

class Slow {
  def doStuff = //slow stuff
}
var slow = new Slow with DynamicTimer
slow.doStuff

In the example above, scalac won't call applyDynamic because it statically resolved your call to doStuff. It will only fall through to applyDynamic if the method you are calling matches none of the names of methods on the type.



来源:https://stackoverflow.com/questions/5185459/dynamic-proxy-using-scalas-new-dynamic-type

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!