2011-08-19 27 views
5

Tôi đang tìm một dấu cắt khớp với các thực thi phương thức trong các lớp con phân lớp một chú thích cụ thể. Các tuyệt vời AspectJ cheat sheet giúp tôi để tạo ra các pointcut sau:@AspectJ pointcut cho các lớp con của một lớp học với chú thích

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

này phù hợp với tất cả các cuộc gọi phương thức của một lớp A mà mang @AnnotationToMatch, nhưng không phải phương pháp của một lớp B kéo dài A. Làm thế nào tôi có thể kết hợp cả hai?

Trả lời

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

Cảm ơn! Vì lợi ích của người khác: nếu bạn sử dụng kiểu chú thích, thì cha mẹ khai báo sẽ dịch thành @DeclareParents ("(@ MyAnnotation *)") riêng tư TrackedParentMarker emptyMixinForClassesWithMyAnnotation; –

+0

Điều đó hoạt động tốt cho các lớp siêu, nhưng không tốt cho các giao diện. I E. trong mã như 'MyInterface o = new MyClass()' có vẻ loke 'MyClass' được tải trước giao diện và điều kiện không khớp. Thêm một 'println (MyInterface.class)' trước khi câu lệnh sửa lỗi, nhưng không phải là yêu cầu khả thi đối với các khía cạnh thư viện. Bất kỳ ý tưởng? – ddimitrov

3

Khả năng khác và đơn giản hơn là khai báo chú thích là @Inherited - do đó nó cũng áp dụng cho các lớp con.

+0

Nhưng nó sẽ không hoạt động nếu bạn không thể khai báo chú thích là @Inherited. Ví dụ. các lớp cơ sở từ thư viện của bên thứ ba. – alehro

+0

Chú thích đọc my.own.annotation. – RCInd

Các vấn đề liên quan