我在Scala项目中使用带有sbt-aspectj的AspectJ库。
我试图用@Pointcut
表达式写if()
:
@Aspect
object PerformanceTracer extends Logger {
@Pointcut("@annotation(PerformanceTracing) && execution(* *(..)) && if()")
def tracePerfPc(jp: ProceedingJoinPoint): Boolean = {
// some logic
}
@Around("tracePerfPc(jp)")
def tracePerformance(jp: ProceedingJoinPoint): Object = {
val start = System.currentTimeMillis
log.debug("{}: start proceeding", jp.toShortString)
val res = jp.proceed
val duration = System.currentTimeMillis - start
log.info("[{} ms] {}: end proceeding. Duration: {} ms.", duration, jp.toShortString, duration)
res
}
}
但我有以下例外:
[warn] warning at <Unknown>::0 Found @Pointcut on a method not returning 'void' or not 'public static boolean'
[error] error at <Unknown>::0 Cannot read debug info for @Aspect to handle formal binding in pointcuts (please compile with 'javac -g' or '<javac debug='true'.../>' in Ant)
[error] org.aspectj.bridge.AbortException: AspectJ failed
[error] at com.lightbend.sbt.SbtAspectj$Ajc$.runAjcMain(SbtAspectj.scala:212)
[error] at com.lightbend.sbt.SbtAspectj$Ajc$.runAjc(SbtAspectj.scala:124)
[error] at
...
因此可以使用注释样式来使用if()切入点 仅在@Pointcut表达式中。 if()不得包含任何内容 身体。带注释的@Pointcut方法必须是public的形式 静态布尔值,可以像往常一样使用正式绑定
是否可以在if()
上对Scala方法使用@Pointcut
表达式?
答案 0 :(得分:2)
请注意tracePerfPc()
的方法签名是
def tracePerfPc(jp: ProceedingJoinPoint): Boolean
或更完整
def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean
scala中的Boolean
(或scala.Boolean
)类型与原始类型且没有对象的Java boolean
不同。
因此,您不能在AspectJ中使用if()
和返回值,因为原始scala中不存在基本类型boolean
。