@AspectJ。 scala(可能 java)lambdas 的切入点

@AspectJ. Pointcut for scala (and probably java) lambdas

是否可以对 scala lambda 进行 poitcut?如果我没记错的话,scala lambdas 现在的编译方式与 java lambdas 相同,所以我认为我的问题也适用于 java lambdas,但我不确定。

这是代码。基本上我想建议 Runnable 实例。如果我使用 classes 或匿名 class,它会完美地工作,但如果我使用 lambdas,它就不会工作。

  @Around("execution(* (com.test..* && java.lang.Runnable+).run())")
  def runnableAspect(pjp: ProceedingJoinPoint): Any = {
    println("Runnable caught")
    pjp.proceed()
  }

这里是测试代码:

package com.test

class Greet {

  def hello(): Unit = {
    println("-----start--------")
    run(new Runnable {
      override def run(): Unit = println("anonymous class")
    })
    println("------------------")
    run(() => println("lambda"))
    println("-----end--------")

  }

  private def run(r: Runnable) = r.run()

}

输出为:

-----start--------
Runnable caught
anonymous class
------------------
lambda
-----end--------

有可能吗?如果是,我做错了什么?

基于 答案。

对于Java

@Around("execution(void com.test..lambda*(..)) || execution(* (com.test..* && java.lang.Runnable+).run())")

对于 Scala

@Around("execution(void com.test..$anonfun*(..)) || execution(* (com.test..* && java.lang.Runnable+).run())")