AspectJ 可以很好地处理 Scala 代码。您只需要遵循 Scala 名称修改规则(即def >
变为def $gt
)等等。
假设你有
class Foo {
def foo(x: Int) {
}
def bar() { }
}
要添加日志记录,您可以使用 Java AspectJ 语法,添加
"org.aspectj" % "aspectjweaver" % "1.7.2",
"org.aspectj" % "aspectjrt" % "1.7.2"
给你的build.sbt
. 继续前进,您可以有以下方面:
@Aspect
public class MonitorAspect {
@Pointcut(value = "execution (* your.package.Foo.*(..))")
public void methodsInFoo() {}
@Before("methodsInFoo()")
public void enter(JoinPoint jp) {
// log
}
@After("methodsInFoo()")
public void exit(JoinPoint jp) {
}
}
最后一部分是META-INF/aop.xml
,它定义了加载时编织器的工作:
<aspectj>
<aspects>
<aspect name="your.package.MonitorAspect"/>
</aspects>
<weaver options="-XnoInline">
<include within="your.package.*"/>
</weaver>
</aspectj>
最后,启动您的 JVM,-javaagent:$PATH_TO_ASPECTJWEAVER.JAR
一切就绪。
在您的情况下,可能值得考虑使用高阶函数。如果您仅使用日志记录作为示例,并且如果您实际上是在某个内部函数之前和之后做某事,那么您应该考虑使用 HOF。
def logged[U](f: => U): U = {
log.info("Before")
val ret = f
log.info("After")
ret
}
在这里,你有一个logged
函数,它接受另一个函数f
,处理日志并做任何事情f
。