当前位置: 首页 > 知识库问答 >
问题:

AspectJ不能在Scala函数上工作?

夹谷野
2023-03-14

我有以下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”的执行没有被捕获。

共有1个答案

巫研
2023-03-14

自己解决了。问题不是函数字面上的,而是类型“long”。如果我在这种情况下使用“java.lang.long”,就可以了。对于泛型类型,AspectJ需要的是“type”,而不是原始类型。在Scala中,数值类型值如Int、Long、甚至Boolean等价于java基元类型

 类似资料:
  • 在Spring框架中,我在使用AOP时遇到了一个奇怪的问题。我有以下简单的bean类的一个问候: 下面是spring配置: AOP建议方法: 测试等级: 输出: 问题: 当我使用getter作为切入点时,为什么两个建议(之前和之后)都被打印出来。建议工作正确时,我使用点切入点displayGreting()方法??

  • 使用scandir()函数时,我收到以下php警告: Scandir无法打开目录:公共html/page2中不允许操作。php在线3 第2页。php 我想使用这个功能来打印我的根文件夹的文件和子目录,但它不工作。 有人知道怎么修吗?

  • 我正在运行CouchDB Docker容器V.2.1.1。在这一点上,除了SSL之外,一切都在工作。我正在遵循关于SSL设置的CouchDB文档。容器具有OpenSSL 1.0.1T。 对最后一个错误进行搜索会出现指示Erlang版本有问题的信息。但是,我相信CouchDB容器已经有了一个补丁版本。我尝试用: 这没什么区别。搜索结果还指出OpenSSL的版本有问题。我从源代码升级到OpenSSL

  • 结果在Windows和Linux之间有所不同。 Linux:鼠标位置:0,0 Windows:鼠标位置:623.0,367.0 我不知道为什么它不能在windows上工作,甚至似乎与lwjgl版本完全无关,因为我尝试了3.1.6、3.2.1、3.2.2和3.2.3-snapshot,所有这些版本都是一样的。所以问题要么是我在创建窗口时忘记了一些东西,要么是windows在某个更新中损坏了一些东西,

  • 我必须在我的项目中使用邮件功能。当我在hostgator上托管我的项目时,它不起作用。但当我托管在其他服务器上时,它工作得很好。我不能理解问题。如果有人知道答案,请解释或建议我的链接,从哪里我可以理解从一开始。谢谢你。这是我的代码。

  • 在Spring中将一个方面配置为: 是: } 如果我使用注释实现方法,正在按预期工作。但是如果注释在接口上,它就不起作用。这是正常行为还是我做错了什么?