[英]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.