2017-08-25 65 views
2

是否有可能爲scala lambda做poitcut?如果我沒有錯誤的scala lambda,現在編譯的方式與java lambda相同,所以我認爲我的問題也適用於java lambda,但我不確定。@AspectJ。 scala(可能是java)的切入點lambdas

這是代碼。基本上我想建議Runnable實例。如果我使用類或匿名類,它會很好地工作,但如果我使用lambda表達式,則它不起作用。

@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-------- 

是否有可能呢?如果是這樣,我做錯了什麼?

回答

1

根據this答案。

對於Java

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

對於斯卡拉

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

它的工作原理。非常感謝你。 –