使用Scalas新动态类型的动态代理

使用Scalas新动态类型的动态代理,scala,scala-2.9,Scala,Scala 2.9,是否可以使用Scalas新的动态类型特性创建类似AOP的拦截器?例如:是否有可能创建一个通用的秒表拦截器,它可以与任意类型的拦截器混合来分析我的代码?或者我仍然需要使用AspectJ吗?我很确定,只有当您选择的对象还没有您选择的对象时,才会使用动态: 从: 此特性的实例x允许对任意方法名meth和参数列表args调用x.meth(args)如果某个调用本机不受x支持,则会将其重写为x.invokeDynamic(“meth”,args) 请注意,自编写文档以来,该方法已被重命名为applyDyn

是否可以使用Scalas新的动态类型特性创建类似AOP的拦截器?例如:是否有可能创建一个通用的秒表拦截器,它可以与任意类型的拦截器混合来分析我的代码?或者我仍然需要使用AspectJ吗?

我很确定,只有当您选择的对象还没有您选择的对象时,才会使用
动态

从:

此特性的实例x允许对任意方法名meth和参数列表args调用x.meth(args)如果某个调用本机不受x支持,则会将其重写为x.invokeDynamic(“meth”,args)


请注意,自编写文档以来,该方法已被重命名为
applyDynamic

,我认为您的可能性很小。只有在方法调用中没有静态匹配时,Scala才会调用applyDynamic:

class Slow {
  def doStuff = //slow stuff
}
var slow = new Slow with DynamicTimer
slow.doStuff
在上面的示例中,scalac不会调用applyDynamic,因为它静态地解析了对doStuff的调用。只有当您正在调用的方法与类型上的任何方法名称都不匹配时,才会使用applyDynamic。

为了将动态对象作为参数提供,它需要具有预期的类型—这意味着从要代理的类或相应的超类/接口继承


一旦您这样做,它将静态提供相关方法,因此永远不会考虑
applyDynamic

动态是2.9的一个特性,而不是2.8;重新标记。:)非常感谢大家的回答。:)