简体   繁体   English

AspectJ无法在Scala函数文字上工作?

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

I have the following scala class and annotated aspectj class: 我有以下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:")
    }

}

function bar works well, but function foo doesn't. 功能栏效果很好,但功能foo却不能。 There is no any errors, seems the execution of function "foo" is not caught. 没有任何错误,似乎未捕获函数“ foo”的执行。

[AppClassLoader@14dad5dc] info AspectJ Weaver Version 1.8.5 built on Thursday Jan 29, 2015 at 01:03:58 GMT [AppClassLoader @ 14dad5dc]信息AspectJ Weaver版本1.8.5(建于2015年1月29日星期四,格林尼治标准时间)

[AppClassLoader@14dad5dc] info register classloader sun.misc.Launcher$AppClassLoader@14dad5dc [AppClassLoader @ 14dad5dc]信息寄存器类加载器sun.misc.Launcher$AppClassLoader@14dad5dc

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

[AppClassLoader@14dad5dc] info register aspect playasjectj.EntityAspect before advice foo: we are the champion [AppClassLoader @ 14dad5dc]信息寄存器方面playasjectj.EntityAspect在建议foo之前:我们是冠军

Anyone knows how to solve the problem? 有人知道如何解决问题吗? I guess it is related to how scala transform the tuple into java class 我想这与scala如何将元组转换为java类有关

solved by myself. 由我自己解决。 the problem is not function literal, but type "Long". 问题不是函数文字,而是键入“ Long”。 If I use "java.lang.Long" in that situation, that works. 如果在这种情况下使用“ java.lang.Long”,那行得通。 for generic type, AspectJ expects "Type",not primitive. 对于泛型类型,AspectJ需要“ Type”,而不是基本类型。 in Scala, numeric type values like Int, Long, even Boolean are equivalent to java primitive type 在Scala中,数值类型值(例如Int,Long,甚至Boolean)等效于Java基本类型

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM