2011-09-11 39 views
1

考慮這個@PointCut如果一個方法是用@Secure註解其被觸發:直接或在繼承的接口中註釋的切入點匹配方法?

@Pointcut("execution(@Secure * *(..)) && @annotation(secure)") 
public void accessOperation(final Access access) { } 

這工作得很好了類似的方法:

class Foo { 
    @Secure 
    public void secureMethod() { } 
} 

但是,它可能有一個Pointcut這也當註釋只存在於像這樣的超類/接口中時被觸發?

interface Foo { 

    @Secure 
    public void secureMethod(); 
} 

class SubFoo implements Foo { 

    @Override 
    public void secureMethod() { // <--- execution of this method should be caught 
     /* .... */ 
    } 
} 

編輯:

這似乎是很密切的關係:@AspectJ pointcut for subclasses of a class with an annotation

唯一的區別是,他們使用一類級別的註解,而我需要一個方法級的註釋。

+0

嚴格來說,這個問題重複[@AspectJ切入點的方法重寫與註釋的接口方法](http://stackoverflow.com/questions/7178782/aspectj-pointcut-for-methods-that-override-an -interface-method-with-an-annotatio) – alehro

回答

1

我不知道AspectJ如何在這種情況下處理註釋,但是如果他只檢查某個註釋的實現類,並且該註釋僅在該類實現的接口上發現,則Java會報告事實上,在類方法中不存在annoation。你應該@Inherited註釋您的註釋:

http://download.oracle.com/javase/6/docs/api/java/lang/annotation/Inherited.html

也許這將這樣的伎倆(儘管在這種情況下,你應該確保你的忠告是:不要多次調用)。

+0

我只是用'Inherited'試過了,但那似乎不起作用: -/ – soc

+0

Check out http://stackoverflow.com/questions/2847640/spring-aop -pointcut-that-matches-annotation-on-interface –

+0

有趣,但對我的情況沒有幫助,因爲我實際上並不知道我方面的類。 – soc

0
I don't actually know the classes in my aspect 

考慮你說的話,並且@Inherited不能在別的什麼,只是類,你都隱含希望AspectJ會做找出是否一個方法(或它的被覆蓋的實現和聲明)的作業中使用的事實被註釋。這比AspectJ宣佈的要多得多。

如果您的最終目標是確保某些代碼安全,那麼所有應該保護的方法應該首先進行適當的註釋。所以,你的問題的答案是否定的,在這種情況下這是不可能的,特別是如果你對這些類一無所知的話。

但是,如果您有權訪問註釋處理器,則可能會有解決方法。在這種情況下,您可以選擇所有@Secure註釋,並通過反射代碼在編譯時生成AspectJ代碼,以正確捕獲所有方法實例。不容易,但可能。

+0

實際的想法是,我會在界面上添加一個註釋來強制所有的實現類通過安全檢查。它對類級別註釋起作用的事實使我希望它也適用於方法。我可以想象,在超類上使用類級註釋,然後遍歷超類中的所有方法,並檢查那些「@ Secure」註釋,然後從子類調用實現。 – soc