2011-06-28 31 views
6

Tôi muốn tạo một phím tắt để nhắm mục tiêu cuộc gọi đến một phương thức từ các phương pháp cụ thể.Phím tắt AspectJ để gọi phương thức theo các phương thức cụ thể

mất sau:

class Parent { 
    public foo() { 
    //do something 
    } 
} 

class Child extends Parent { 
    public bar1() { 
    foo(); 
    } 
    public bar2() { 
    foo(); 
    } 
    public bar3() { 
    foo(); 
    } 
} 

Tôi muốn có một vết cắt điểm trên cuộc gọi đến foo() trong phương pháp bar1() và bar3()

Tôi đã suy nghĩ cái gì đó như

pointcut fooOperation(): call(public void Parent.foo() && (execution(* Child.bar1()) || execution(* Child.bar3())); 

before() : fooOperation() { 
    //do something else 
} 

tuy nhiên, điều đó dường như không hoạt động. bất kỳ ý tưởng?

nhờ

Trả lời

2

suy nghĩ những gì bạn muốn là thay vì làm các điều khoản thực hiện (trong đó có những bất lợi gia tăng của yêu cầu bổ sung đối với từng người gọi mới), là sử dụng mục tiêu, ví dụ một cái gì đó như:

target(Child) && call(public void Parent.foo()). 

Hơi ngạc nhiên, tôi đã tìm thấy hướng dẫn định hướng trong tài liệu nhật thực khá hữu ích. Chúng là here.

+0

tôi muốn nói một điều này cũng sẽ phù hợp với các cuộc gọi để 'foo()' trong 'bar2()', trái với ý định? – ShiDoiSi

+0

có, điều đó sẽ bắt 'foo()' trong 'bar2()', đó không phải là những gì được dự định – kabal

+0

Haha. Dưới đây là một đề nghị: nếu bạn muốn chụp foo() từ bar2..barn, hãy sử dụng điểm cắt của tôi và bỏ qua cuộc gọi đến foo từ bar1. Đến và thay đổi định nghĩa đó mỗi khi một thanh mới được thêm vào không phải là rất bueno. – Rob

3

lẽ withincode sẽ làm việc:

call(public void Parent.foo()) && (withincode(* Child.bar1()) || withincode(* Child.bar3())); 

Hoặc bạn có thể thử các cflow pointcut:

pointcut bar1(): call(* Child.bar1()); 
pointcut bar3(): call(* Child.bar3()); 

call(public void Parent.foo()) && (cflow(bar1()) || cflow(bar3()); 

Nhìn vào đây để xem pointcut reference

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