2012-04-08 79 views
0

請參考http://java.sun.com/developer/technicalArticles/JavaLP/Interposing/孫解釋插入

,然後將下面的解釋:

在類裝入時,插入的類必須在 原來之前發現...插入的類必須有原名爲 。例如,類Foo可以存在於包pub.foo 中,並從包pub.bar創建類Bar的實例。在另一個目錄中創建一個 文件Bar.java,例如假/ pub/bar和 預先考慮/假冒類路徑,確保JVM將加載我們的 類的pub.bar.Bar定義而不是原始的。通過這種方式,我們可以將我們對Bar方法的定義置於原件之上。

在下面的示例中,Bar.java是接口 - 將插入其接口的對象。

我無法理解Sun在上面的報價中解釋了什麼用例。具體疑問: 1.提到哪一類原始類? 2.在什麼情況下,我需要有我自己的假/ pub.bar.Bar,而不是使用原來的(如果我已經正確解釋了原稿的含義)。如果可能,請用例子來解釋。

感謝advane

回答

0

我相信你創建代理的兩種方式混合起來:CGLIB和運行代理。第一個創建代理,而你的類正在加載和第二個,因爲它的名字說它在運行時。它們是相同的,它們都是圍繞對象創建透明代理,但它們之間存在一些顯着差異。例如,CGlib需要一個類是非最終的,並且具有默認的構造函數。或者讓我們考慮下面的例子。比方說,你有一個服務MyService

public class MyService { 
    @Transactional 
    public void proxifiedMethod(){ 
     // some logic here  
    } 

    public void pureMethod(){ 
     // some logic here... 
     proxifiedMethod(); 
     // ...and here 
    } 
} 

比方說,你需要proxifiedMethod一個事務中運行,你給一個提示你@Transactional註釋使用的框架。如果框架(比如說Spring)被配置爲使用運行時代理,那麼將不會創建從pureMethod調用的proxifiedMethod的事務,但在CGLib的情況下它將會創建。

回答您的問題:

  1. 原班是圍繞實例一類被創建的代理對象。

  2. 當涉及諸如cross-cutting concerns作爲事務或安全性時,您所指的運行時代理被廣泛用於Java企業領域。通常你不想用手動事務管理混淆你的代碼,這是通過像Spring這樣的框架或者像JBoss這樣的應用程序容器來完成的。因此,您添加了一些元數據信息,如@Transactional批註,並且框架在您的註釋服務周圍創建代理以處理那裏的事務管理邏輯。

+0

謝謝。把這個疑問貼在一個錯誤的標題下(現在改變了)是我的錯。我一遍又一遍地閱讀這篇文章,現在已經有了類加載的疑問。爲什麼說Proxy類應該在實際之前加載?是因爲它會在原來的版本之前使用嗎?另外爲newProxyInstance方法提供類加載器有什麼意義?再次感謝。 – Mustafa 2012-04-08 07:30:48