我有像 @SecureObject 这样的注释,它可能适用于某些类。另外还有 ORM,它提供了类似的方法
public ObjectID get(Class paramClass, Object 对象);
现在我需要创建切面,只有当 paramClass 使用 @SecureObject 注解时才会触发切面。
简单的解决方案,例如:
@Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))"
void runBefore() {
// method code
}
不起作用 - 方法从未被调用。但有线(用方面j -debug检查)。
是否可以使用 AspectJ 实现此类行为?如果可以,如何实现?
最佳答案
问题是 get()
方法的第一个参数是 Class
类型。
鉴于此,您不能使用基于注释的方法签名模式。一种可能的解决方案是使用 if() pointcut expressions :
package aspects;
@Aspect
public class MyAspect {
@Pointcut("if() && call(public * some.orm.Datastore.get(..)) && args(paramClass,..)")
public static boolean runBefore(JoinPoint jp, Class paramClass) {
return paramClass.isAnnotationPresent(annotation.SecureObject.class);
}
@Before("runBefore(jp, paramClass)")
public void runBeforeAdvice(JoinPoint jp, Class paramClass) {
System.out.println("annotated!");
}
}
注意:如果不存在 @SecureObject 注释,但 if() 条件在运行时评估,则此切入点也会触发。
关于java - 将参数与类上的自定义注释相匹配 - 在运行时检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109246/