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

时间:2011-03-03 19:23:11

标签: scala scala-2.9

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

3 个答案:

答案 0 :(得分:5)

我很确定Dynamic仅在您选择的对象尚未拥有您选择的内容时使用:

来自nightly scaladoc

  

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

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

答案 1 :(得分:2)

没有

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

只要你这样做,就会有静态提供的相关方法,因此永远不会考虑applyDynamic

答案 2 :(得分:1)

我认为你的赔率很糟糕。只有在方法调用上没有静态匹配时,Scala才会调用applyDynamic:

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

在上面的示例中,scalac不会调用applyDynamic,因为它会静态解析您对doStuff的调用。如果您调用的方法与该类型的方法的名称都不匹配,则只会通过applyDynamic。