@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())")
是否可以对 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())")