【问题标题】:Does aspectj have access to implicit parameters on a method in Scala?aspectj 是否可以访问 Scala 中方法的隐式参数?
【发布时间】:2013-06-24 07:33:02
【问题描述】:

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

还有人试试这个吗?

【问题讨论】:

  • 你查看过使用javap的类文件吗?隐式参数应显示为“正常”参数。所以从 aspectj 的角度来看,应该可以用“正常”的方式来处理它。
  • 抱歉,我不明白你的意思。您是否建议我尝试看看 aspectj 如何呈现签名?我希望不必这样做。但如果这是我必须做的,我当然会去做。我只是希望有人能找到答案。
  • aspectj 并没有真正呈现签名,它只是“查看”它。这就是我想用javap 指出的。无论如何,我已经对其进行了测试,并将其作为答案发布。

标签: scala aop aspectj implicit


【解决方案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);
}

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

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

【讨论】:

  • 很公平。只要编织是在加载时或编译时在已编译的 scala 类上完成的,就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 2015-05-22
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多