Scala + AspectJ:if() 切入点表达式
Scala + AspectJ: if() pointcut expressions
我在我的 Scala 项目中将 AspectJ 库与 sbt-aspectj 一起使用。
我正在尝试用 if()
表达式编写 @Pointcut
:
@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
...
It is thus possible with the annotation style to use the if() pointcut
only within an @Pointcut expression. The if() must not contain any
body. The annotated @Pointcut method must then be of the form public
static boolean and can use formal bindings as usual
是否可以在 Scala 方法的 @Pointcut
中使用 if()
表达式?
请注意,您 tracePerfPc()
的方法签名是
def tracePerfPc(jp: ProceedingJoinPoint): Boolean
或更完整
def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean
scala 中的类型 Boolean
(或 scala.Boolean
)与 Java boolean
不同,后者是原始类型,没有对象。
因此您不能在 AspectJ 中将 if()
与 return 值一起使用,因为原始类型 boolean
在本机 scala 中不存在。
我在我的 Scala 项目中将 AspectJ 库与 sbt-aspectj 一起使用。
我正在尝试用 if()
表达式编写 @Pointcut
:
@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
...
It is thus possible with the annotation style to use the if() pointcut only within an @Pointcut expression. The if() must not contain any body. The annotated @Pointcut method must then be of the form public static boolean and can use formal bindings as usual
是否可以在 Scala 方法的 @Pointcut
中使用 if()
表达式?
请注意,您 tracePerfPc()
的方法签名是
def tracePerfPc(jp: ProceedingJoinPoint): Boolean
或更完整
def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean
scala 中的类型 Boolean
(或 scala.Boolean
)与 Java boolean
不同,后者是原始类型,没有对象。
因此您不能在 AspectJ 中将 if()
与 return 值一起使用,因为原始类型 boolean
在本机 scala 中不存在。