将参数与类上的自定义注释匹配 - 在运行时检测

时间:2012-04-11 15:37:02

标签: java annotations aspectj

我有@SecureObject之类的注释,可能会应用于某些类。另外还有ORM,它提供了像

这样的方法

public ObjectID get(Class paramClass,Object object);

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

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

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

不起作用 - 永远不会调用方法。但有线(用aspectj -debug检查)。

是否有可能使用AspectJ实现此类行为,如果是 - 如何?

1 个答案:

答案 0 :(得分:1)

问题是,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()条件,则此切入点也会触发。