是否可以使用 Scalas 的新动态类型功能创建类似 AOP 的拦截器?例如:是否有可能创建一个通用的秒表拦截器,它可以与任意类型混合以分析我的代码?还是我仍然必须使用 AspectJ?
问问题
604 次
3 回答
5
我很确定Dynamic
仅在您选择的对象还没有您选择的对象时使用:
此特征的实例 x 允许对任意方法名称 meth 和参数列表 args 调用 x.meth(args)。如果 x 本身不支持调用,则将其重写为 x.invokeDynamic("meth", args)
请注意,自从编写文档以来,该方法已重命名为applyDynamic
.
于 2011-03-03T21:15:45.447 回答
2
不。
为了将动态对象作为参数提供,它需要具有预期的类型 - 这意味着从您要代理的类或从适当的超类/接口继承。
一旦您这样做,它将静态提供相关方法,因此applyDynamic
永远不会被考虑。
于 2011-03-03T21:50:55.360 回答
1
我觉得你的胜算不大。只有在方法调用上没有静态匹配时,Scala 才会调用 applyDynamic:
class Slow {
def doStuff = //slow stuff
}
var slow = new Slow with DynamicTimer
slow.doStuff
在上面的示例中,scalac 不会调用 applyDynamic,因为它静态解析了您对 doStuff 的调用。只有当您调用的方法与该类型上的任何方法名称都不匹配时,它才会落入 applyDynamic 。
于 2011-03-03T21:16:49.907 回答