2012-04-11 64 views
0

我有@SecureObject之類的註釋,它可能適用於某些類。另外還有ORM,它提供瞭如下方法:將參數與類上的自定義註釋匹配 - 在運行時檢測

public ObjectID get(Class paramClass,Object object);

現在我需要創建方面,只有在paramClass用@SecureObject註釋的情況下才會觸發該方面。

簡單的解決方案,如:

@Before("call(public * some.orm.Datastore.get(..,@SecureObject *,..))" 
    void runBefore() { 
    // method code 
} 

不起作用 - 方法不會被調用。但有線(用aspectj -debug檢查)。

是否有可能通過AspectJ實現這樣的行爲,如果是這樣 - 如何?

回答

1

問題是您的get()方法的第一個參數的類型是Class

鑑於此,您不能使用基於註釋的方法簽名模式。一個可能的解決方案是使用一個if() pointcut expressions

package aspects; 

@Aspect 
public class MyAspect { 

    @Pointcut("if() && call(public * some.orm.Datastore.get(..)) && args(paramClass,..)") 
    public static boolean runBefore(JoinPoint jp, Class paramClass) { 
     return paramClass.isAnnotationPresent(annotation.SecureObject.class); 
    } 

    @Before("runBefore(jp, paramClass)") 
    public void runBeforeAdvice(JoinPoint jp, Class paramClass) { 
     System.out.println("annotated!"); 
    } 
} 

注意:此切入點還觸發如果沒有@SecureObject註釋存在,但如果()條件都在運行時評估。

+0

所以基本上,如果我可以構造不同類型的條件與常見的「條件」的子類化的幫助? – jdevelop 2012-05-07 21:00:54