1

我正在使用 aspectJ 进行一些用户身份验证。将 userId 作为方法的隐式参数会非常好。但我不知道 aspectJ joinPoint 是否可以看到隐式参数。

还有人试试这个吗?

4

1 回答 1

1

给定一个服务

class User(val name: String) {
  override def toString = s"$name"
}

class Service {
  def run()(implicit user: User) {
    println(user.name)
  }

隐式参数只是作为类文件中的“正常”参数出现(来自 的输出javap):

public class app.scala.Service extends java.lang.Object{
    public void run(app.scala.User);
    public app.scala.Service();
}

所以使用“正常”的 AspectJ 切入点,例如:

before(Service s, User user) : 
    call(void Service.run(User)) && target(s) && args(user) {

    System.out.println("Hello from AspectJ (before service run)");
    System.out.println("  "  + user);
}

有效(适用于 .class 生成的文件scalac)。

从 aspectj 的角度来看,隐式参数没什么特别的。Scala 编译器将多个参数列表中的参数合并为一个,并将其存储在 .class 文件中。

于 2013-06-24T12:48:19.253 回答