我正在使用 aspectJ 进行一些用户身份验证。将 userId 作为方法的隐式参数会非常好。但我不知道 aspectJ joinPoint 是否可以看到隐式参数。
还有人试试这个吗?
给定一个服务
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 文件中。