2011-04-02 102 views
5

我想從業務類中的方法訪問方面類中的方法中的局部變量。例如在ASPECT中的方法中訪問業務方法的局部變量

class BusinessClass { 
    public void simpleTest() { 
     ... 
     String localString = new String("test"); 
     ... 
    } 
} 

MyAspect { 
    log() { 
     // I WANT TO ACCESS THE VALUE OF LOCALSTRING HERE 
    } 
} 

我想訪問myAspect的日誌方法中的localString值。請讓我知道是否有任何方法使用Spring/AspectJ來完成此操作。另外,是否有一種方法可以在不改變simpleTest方法簽名的情況下完成?

非常感謝!

回答

5

據我所知,方面旨在適用於許多方法(由切入點定義)。因此,他們沒有看到方法的內部結構:只是方法的參數以及方法的結果。這意味着你不想要直接,但你可以嘗試將你的方法重構爲兩部分,一部分以localString作爲參數,另一部分將默認值應用於它。然後,這將給你一個很好的方便的聯合點附加。 (AspectJ reference lists join points,以及對局部變量的引用不是其中之一。)如果你將「內部」方法設置爲private或package-private,那麼甚至不會更改方法的通常理解的簽名(因爲外部代碼獲勝不能依賴於引入的方法)。

+0

另請注意,Spring AOP僅支持AspectJ的一個子集。 – 2011-04-02 10:33:25

15

不幸的是,局部變量不通過連接點暴露。這意味着你不能寫一個切入點來匹配它們。所以,答案是否定的,你不能直接這樣做。

但是,如果您要重構代碼,以便局部變量在方法內部創建,那麼您可以訪問它。

從概念上講,這種重構可能會更適合您的代碼。不是簡單地分配一個新的局部變量,而是通過將其封裝在一個命名好的方法中來明確分配的內容。

例如,這樣的:

String localString = new String("test"); 

變成這樣:

String localString = allocateTestString(); // or some better name 

使用這種方法:

private String allocateTestString() { 
    return new String("test") 
} 

然後,你可以寫一個切入點來捕捉局部變量這樣:

after() returning(String var) : call(private String allocateTestString()) { 
    // do something fun 
} 
+0

雖然你的回答也是正確的,但是他在第一次回答的時候投了Donal。再次感謝您的投入。 – San 2011-04-04 09:22:04

+0

是否有可能將實例變量傳遞給切入點? – Irakli 2016-10-31 06:49:41

相關問題