簡體   English   中英

AspectJ無法在Scala函數文字上工作?

[英]AspectJ can't work on Scala function literal?

我有以下scala類和帶注釋的aspectj類:

package playasjectj

import org.aspectj.lang.annotation.Pointcut
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before

class Entity {
    def foo(p:String):String ={
      return p
    }
    def bar(handler:(String,String,Long)=>String):Unit={
        handler("first", "second", 100L)
    }
}

object Entity {
  def main(args:Array[String]){
     val inst = new Entity
     inst.foo("we are the champion")
     val handler = (first:String, second:String, value:Long) => {
          first + second + ":" + value
     }
     inst.bar(handler)
  }
}

@Aspect
class EntityAspect{

    @Pointcut("execution(* foo(String) ) && target(playasjectj.Entity) && args(p)")
    def pointcut_foo(p:String):Unit={}

    @Pointcut("execution(* bar(scala.Function3<String,String,Long,String>)) && target(playasjectj.Entity) && args(handler)")
    def pointcut_bar(handler: (String,String,Long)=>String):Unit={}

    @Before("pointcut_foo(p)")
    def beforeAdvice_foo(p:String):Unit={
        println("before advice foo: "  + p)
    }

    @Before("pointcut_bar(handler)")
    def beforeAdvice_bar(handler:(String,String,Long)=>String):Unit={
        println("before advice bar:")
    }

}

功能欄效果很好,但功能foo卻不能。 沒有任何錯誤,似乎未捕獲函數“ foo”的執行。

[AppClassLoader @ 14dad5dc]信息AspectJ Weaver版本1.8.5(建於2015年1月29日星期四,格林尼治標准時間)

[AppClassLoader @ 14dad5dc]信息寄存器類加載器sun.misc.Launcher$AppClassLoader@14dad5dc

[AppClassLoader @ 14dad5dc]使用配置/Users/grant/programming/java/workspace/playasjectj/bin/META-INF/aop.xml的信息

[AppClassLoader @ 14dad5dc]信息寄存器方面playasjectj.EntityAspect在建議foo之前:我們是冠軍

有人知道如何解決問題嗎? 我想這與scala如何將元組轉換為java類有關

由我自己解決。 問題不是函數文字,而是鍵入“ Long”。 如果在這種情況下使用“ java.lang.Long”,那行得通。 對於泛型類型,AspectJ需要“ Type”,而不是基本類型。 在Scala中,數值類型值(例如Int,Long,甚至Boolean)等效於Java基本類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM