2012-08-29 34 views
2

這裏是註釋:如何定義一個aspectj切入點來挑選具有特定註釋的類的所有構造函數?

@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的構造函數,而不匹配任何其他類的任何其他類的構造函數,NOT MyAnnotation註釋。

回答

6

你的切入點應該是這樣的:

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) 

相反,如果你確實需要構造的對象用於任何目的。

+0

你試過嗎?我問,因爲我試圖在構造函數上定義執行連接點,結果是一個警告,說它不能被應用。該文檔使用call()提供構造函數切入點基元的語法,但不是與執行()等效的語法。 – PineForest

+0

是的,我試過了。我甚至在本地複製了你的類和註解,並用實例化對象的main方法編寫了一個驅動類。 – kriegaex

+0

如果你願意,去我的主頁(查看我的個人資料),找到在線聊天並與我交換電子郵件地址。也許我可以幫助你,如果我看到完整的代碼。或者只是使用聯繫表格。哦,順便說一下:你看過內部支架嗎? – kriegaex

0

以下作品,但不推薦使用kriegaex。這裏提供了可能的材料,如果需要的話可以重新使用。

這是我對問題的第一個工作解決方案,它部分使用了initial()pointcut原語。

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; 
    } 
} 
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; 
    } 
} 
+0

這是你的解決方案。這與上面的許多片段之間唯一的區別在於它在這裏被完整地表示出來。我只能猜測,讓我檢查你的回覆是有一定價值的。如果是這種情況,請將其複製並粘貼到上面的回覆中,然後我會很高興地刪除這個並再次檢查您的回覆。 – PineForest

+0

好的。感謝您的反饋意見。我更新了我的「選定」答案,以便您獲得應有的認可。 – PineForest

相關問題