这里是注释:
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
String name();
}
下面是一个注释类:
@MyAnnotation(name="foo")
public class ClassA {
public ClassA() {
// Do something
}
}
这是第二个注解类:
@MyAnnotation(name="bar")
public class ClassB {
public ClassB(String aString) {
// Do something
}
}
我找了一个AspectJ切入点,虽然不匹配任何其他构造方法,供没有被标注任何其他类ClassA和ClassB的构造函数正确匹配MyAnnotation
。
你的切入点应该是这样的:
execution((@MyAnnotation *).new(..))
如果注释是在另一个包:
execution((@de.scrum_master.aop.demo.MyAnnotation *).new(..))
或者,如果你不想完全限定包:
execution((@*..MyAnnotation *).new(..))
编辑:好的,一些有关在评论你的问题的详细信息:
构造函数执行没有返回值,你可以捕获
after() returning(Object myObject) : myJoinpoint()
这仅适用于方法。 所以,请用
after(Object myObject) returning : myJoinpoint() && this(myObject)
反而如果你需要任何目的构造的对象。
这是从整体kriegaex工作的解决方案:
public aspect AnnotationTests {
public aspect AnnotationTests {
after(Object myObject) returning : execution((@MyAnnotation *).new(..))
&& this(myObject) {
System.out.println("Object class name: " + myObject.getClass().getName());
}
}
}
@MyAnnotation(name="foo")
public class ClassA {
public ClassA() {
// Do something
}
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassB classB = new ClassB("");
if (classA.getClass().getName().equals(classB.getClass().getName())) {
throw new RuntimeException("Big problems!");
}
}
}
@MyAnnotation(name="bar")
public class ClassB {
private final String aString;
public ClassB(String aString) {
this.aString = aString;
}
}
下面的工作,但不推荐采用kriegaex。 这里提供的尽可能的材料,可以改变用途,如有需要。
这是我的第一个工作解决这部分使用的初始化()切入点原始的问题。
public aspect AnnotationTests {
private pointcut genericConstructor(): initialization(*.new(..));
private pointcut withinMyAnnotation(): @within(MyAnnotation);
private pointcut constructorInAnnotatedClass(): genericConstructor()
&& withinMyAnnotation();
before(): constructorInAnnotatedClass() && !cflowbelow(constructorInAnnotatedClass()) {
final Object objectInstance = thisJoinPoint.getTarget();
System.out.println("Object class name at join point: "
+ objectInstance.getClass().getName());
}
}
@MyAnnotation(name="foo")
public class ClassA {
public ClassA() {
// Do something
}
public static void main(String[] args) {
ClassA classA = new ClassA();
ClassB classB = new ClassB("");
if (classA.getClass().getName().equals(classB.getClass().getName())) {
throw new RuntimeException("Big problems!");
}
}
}
@MyAnnotation(name="bar")
public class ClassB {
private final String aString;
public ClassB(String aString) {
this.aString = aString;
}
}
文章来源: How to define an aspectj pointcut that picks out all constructors of a class that has a specific annotation?