2011-08-19 106 views
5

我正在尋找的是在繼承類與特定的註解類匹配的方法執行切入點一類的子類。優秀AspectJ cheat sheet幫助我創建下面的切入點:@AspectJ切入點與註釋

within(@my.own.annotations.AnnotationToMatch *) && execution(* *(..)) 

該攜帶擴展答:我怎樣才能既符合B類的@AnnotationToMatch,而不是方法A類的所有方法調用相匹配?

回答

3
public aspect AnnotatedParentPointcutAspect { 

//introducing empty marker interface 
declare parents : (@MyAnnotation *) implements TrackedParentMarker; 

public pointcut p1() : execution(* TrackedParentMarker+.*(..)); 

before(): p1(){ 
    System.out.println("Crosscutted method: " 
      +thisJoinPointStaticPart.getSignature().getDeclaringTypeName() 
      +"." 
      +thisJoinPointStaticPart.getSignature().getName()); 
} 
} 
+1

謝謝!對於其他人的好處:如果你使用註釋風格,申報父母轉化爲@DeclareParents(「(@ MyAnnotation *)」) 私人TrackedParentMarker emptyMixinForClassesWithMyAnnotation; –

+0

這對於超級類很適用,但對於接口不太好。即在代碼如'MyInterface的O =新MyClass的()',它看起來洛克'MyClass'獲取接口之前加載和條件不匹配。在語句修復問題之前添加'println(MyInterface.class)',但對庫方面來說不是可行的要求。有任何想法嗎? – ddimitrov

3

另一個更簡單的可能性是將註釋聲明爲@Inherited - 因此它也適用於子類。

+0

但是,如果您不能將註釋聲明爲@Inherited,它將不起作用。例如。來自第三方庫的基類。 – alehro

+0

註釋讀取my.own.annotation。 – RCInd