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

标签 java annotations aspectj

我有像 @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/

相关文章:

java - 从 Java 源文件中获取类注解

java - 在这种情况下性能优于 AspectJ 的方面框架?

Java自定义注解在调用被注解的方法之前调用其他一些方法

java - Checkstyle 和 PMD 仅作为建议

java - Spring Boot应用程序部署在远程服务器上

java - 泛型<T extends Comparable<?的解释collection.sort/comparable 代码中的 super T>>?

ios - 如何检测在 MapView 中选择了哪个注释

java - Hibernate:未知的mappedBy in:,引用的属性未知:

java - 添加 void addFoodFirst(String foodName) 并仅使用 1 条语句,将 foodName 添加到食物的开头作为第一个元素

java - 在 Eclipse 3.6.1 上安装 AspectJ 时遇到问题