我有@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实现此类行为,如果是 - 如何?
答案 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()条件,则此切入点也会触发。