是否可以使用Scalas新的动态类型功能创建类似拦截器的AOP?例如:是否可以创建一个通用的秒表拦截器,它可以与任意类型混合以分析我的代码?或者我还需要使用AspectJ吗?
答案 0 :(得分:5)
我很确定Dynamic
仅在您选择的对象尚未拥有您选择的内容时使用:
此特征的实例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。