2015-10-01 71 views
2

獲得註釋的對象我有一個這樣的註釋:如何使用AspectJ

@Inherited 
@Documented 
@Target(value={ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Restful { 

} 

我註釋這個類是這樣的:

@Restful 
public class TestAspect { 
    public String yes; 
} 

我有一個切入點是這樣的:

@Pointcut("@annotation(com.rest.config.Restful)") 
    public void pointCutMethod() { 
} 

我試過了:

@Before("pointCutMethod()") 
public void beforeClass(JoinPoint joinPoint) { 
    System.out.println("@Restful DONE"); 
    System.out.println(joinPoint.getThis()); 
} 

但getThis()返回null。

基本上我試圖得到TestAspect的對象實例。我該怎麼做?任何線索?任何幫助將非常感激。

在此先感謝

回答

1

有了您的註釋放在只有類型和切入點@annotation(com.rest.config.Restful)你只打算以匹配靜態初始化連接點的類型。正如我們可以看到,如果你使用-showWeaveInfo當你編譯(我摑你的代碼樣本到一個名爲Demo.java文件):

Join point 'staticinitialization(void TestAspect.<clinit>())' in 
    Type 'TestAspect' (Demo.java:9) advised by before advice from 'X' (Demo.java:19) 

當靜態初始化運行沒有this,因此你會得到空當您檢索它從thisJoinPoint。你沒有說你真正想要建議的,但讓我假設它是創建一個TestAspect的新實例。你的切入點需要匹配的構造函數執行此註釋類型:

// Execution of a constructor on a type annotated by @Restful 
@Pointcut("execution((@Restful *).new(..))") 
public void pointcutMethod() { } 

如果你想匹配該類型的方法,這將是這樣的:

@Pointcut("execution(* (@Restful *).*(..))") 
+0

感謝@Andy克萊門特但作爲你可以看到,我試圖獲得一個在java ee環境中創建的實例(提示:java ee 6是其中一個標籤),執行中的新行爲將不起作用。它會在se環境中工作。有關如何在ee 6/7環境中執行此操作的任何線索? – Ikthiander