AspectJ 不能在 Scala 函数文字上工作?
AspectJ can't work on Scala function literal?
我有以下 scala class 和带注释的 aspectj class:
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:")
}
}
函数 bar 运行良好,但函数 foo 运行不佳。没有任何错误,似乎函数 "foo" 的执行没有被捕获。
[AppClassLoader@14dad5dc] 信息 AspectJ Weaver 版本 1.8.5 构建于 2015 年 1 月 29 日星期四 01:03:58 GMT
[AppClassLoader@14dad5dc] 信息注册 classloader 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 class
有关
自己解决。问题不是函数字面量,而是类型 "Long"。如果我在那种情况下使用 "java.lang.Long",那就行得通了。对于泛型类型,AspectJ 期望 "Type",而不是原始类型。在 Scala 中,像 Int、Long 甚至 Boolean 这样的数字类型值等同于 java 原始类型
我有以下 scala class 和带注释的 aspectj class:
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:")
}
}
函数 bar 运行良好,但函数 foo 运行不佳。没有任何错误,似乎函数 "foo" 的执行没有被捕获。
[AppClassLoader@14dad5dc] 信息 AspectJ Weaver 版本 1.8.5 构建于 2015 年 1 月 29 日星期四 01:03:58 GMT
[AppClassLoader@14dad5dc] 信息注册 classloader 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 class
有关自己解决。问题不是函数字面量,而是类型 "Long"。如果我在那种情况下使用 "java.lang.Long",那就行得通了。对于泛型类型,AspectJ 期望 "Type",而不是原始类型。在 Scala 中,像 Int、Long 甚至 Boolean 这样的数字类型值等同于 java 原始类型