Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将参数与类上的自定义注释匹配-在运行时检测_Java_Annotations_Aspectj - Fatal编程技术网

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

Java 将参数与类上的自定义注释匹配-在运行时检测,java,annotations,aspectj,Java,Annotations,Aspectj,我有类似@SecureObject的注释,它可能应用于某些类。另外还有ORM,它提供了如下方法 public ObjectID get(类paramClass,对象对象) 现在我需要创建方面,只有在paramClass被@SecureObject注释时才会触发 简单的解决方案,如: @Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))" void runBefore() { // method

我有类似@SecureObject的注释,它可能应用于某些类。另外还有ORM,它提供了如下方法

public ObjectID get(类paramClass,对象对象)

现在我需要创建方面,只有在paramClass被@SecureObject注释时才会触发

简单的解决方案,如:

@Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))"
   void runBefore() {
     // method code
}
不起作用-从不调用方法。但是有线的(通过aspectj-debug检查)


AspectJ有可能实现这种行为吗?如果有,如何实现?

问题是
get()
方法的第一个参数的类型是
Class

因此,不能使用基于注释的方法签名模式。一种可能的解决方案是使用:


注意:如果不存在@SecureObject注释,但在运行时对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!");
    }
}