如何定义一个AspectJ切入点挑出具有特定注释类的所有构造函数?(How to define an

2019-06-27 13:41发布

这里是注释:

@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

Answer 1:

你的切入点应该是这样的:

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)

反而如果你需要任何目的构造的对象。



Answer 2:

这是从整体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;
  }
}


Answer 3:

下面的工作,但不推荐采用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?