0

我有像@SecureObject 这样的注释,它可能适用于某些类。此外还有 ORM,它提供了类似的方法

public ObjectID get(Class paramClass, Object object);

现在我需要创建方面,只有在 paramClass 使用@SecureObject 注释的情况下才会触发。

直截了当的解决方案,例如:

@Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))"
   void runBefore() {
     // method code
}

不起作用 - 永远不会调用方法。但已连接(使用 aspectj -debug 检查)。

是否可以使用 AspectJ 实现这种行为,如果可以,如何实现?

4

1 回答 1

1

问题是您的get()方法的第一个参数是 type Class

鉴于此,您不能使用基于注释的方法签名模式。一种可能的解决方案是使用if() 切入点表达式

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() 条件在运行时被评估,则此切入点也会触发。

于 2012-05-03T09:12:28.743 回答