首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala + AspectJ: if()切入点表达式

Scala + AspectJ: if()切入点表达式
EN

Stack Overflow用户
提问于 2018-02-28 09:20:27
回答 1查看 536关注 0票数 1

我在我的Scala项目中使用AspectJ库和sbt-aspectj。我试图用@Pointcut表达式编写if()

代码语言:javascript
复制
@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
  }
}

但我有以下例外:

代码语言:javascript
复制
[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 
...

以下AspectJ教程说:

因此,通过注释样式,只在@Pointcut表达式中使用if()切入点是可能的。if()不能包含任何主体。然后,带注释的@Pointcut方法必须是公共静态布尔值,并且可以像往常一样使用形式绑定。

在Scala方法上可以在if()中使用@Pointcut表达式吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 12:02:32

请注意,您的tracePerfPc()方法签名是

代码语言:javascript
复制
def tracePerfPc(jp: ProceedingJoinPoint): Boolean

或更完整

代码语言:javascript
复制
def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean

scala中的Boolean (或scala.Boolean)类型与boolean不同,后者是一个原始类型,没有对象。

因此,您不能在if()中使用AspectJ和返回值,因为原生scala中不存在boolean基元类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49025922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档