Java 将参数与类上的自定义注释匹配-在运行时检测
我有类似@SecureObject的注释,它可能应用于某些类。另外还有ORM,它提供了如下方法 public ObjectID get(类paramClass,对象对象) 现在我需要创建方面,只有在paramClass被@SecureObject注释时才会触发 简单的解决方案,如: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
@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!");
}
}