【问题标题】:Match argument with custom annotation on class - detect in runtime将参数与类上的自定义注释匹配 - 在运行时检测
【发布时间】:2012-04-11 15:37:01
【问题描述】:

我有像@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 实现这种行为,如果可以,如何实现?

【问题讨论】:

    标签: java annotations aspectj


    【解决方案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() 条件在运行时被评估,这个切入点也会触发。

    【讨论】:

    • 如果我可以用常见“条件”的子类构造不同类型的条件,那么基本上是在它的帮助下?
    猜你喜欢
    • 2012-12-25
    • 2014-04-12
    • 2011-01-09
    • 2012-12-12
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多