使用Proxy.newProxyInstance包裝物件池,免去returnObject方法呼叫
希望能實現一個物件池,但是同時要避免呼叫returnObject。
因為如果可以避免呼叫returnObject,那麼就原來的程式碼就可以不做修改就能使用物件池優化功能了。
下面是為了實現上述功能寫的示例程式碼。
先宣告一點,準備儲存到池裡面的物件是不用在兩次呼叫之間儲存狀態的。
所以下面的示例程式碼中,每次呼叫一個方法的時候,都從池裡面找一個物件,用完之後,立即歸還。
所以原來的程式碼中,每次使用物件的時候,從工廠裡面new一個物件出來,使用完了也不做任何處理。
類似如下程式碼。
.... SamplePortType obj = new SampleClass(); obj.helloWorld(); .... <p> |
另外,由於是示例程式碼,所以裡面涉及多執行緒同步的問題也做處理。
程式碼雖然寫了出來,就這個示例程式來說,也能跑了,
但是對其中的實現方法存在一些疑問。
主要的疑問是,示例程式碼中,Proxy.newProxyInstance 每次都是使用同樣的一個物件來建立動態代理,
然後實際invoke(Object proxy, Method method, Object[] args)的時候,使用另外一個物件去執行。
不知道這樣做會不會存在問題?
不知道為了實現剛開始提出的問題,有什麼其他辦法?
import java.util.logging.*; import java.util.Stack; import java.lang.reflect.*; import java.lang.Object; import java.lang.System; interface SamplePortType { public void helloWorld ( ); }; class SampleClass implements SamplePortType { public SampleClass ( ) { } public void helloWorld ( ) { System.out.println ( "Hello world!" ); } }; class SamplePool { static private SamplePool _instance; static public SamplePool getInstance() { if ( null == _instance ) { _instance = new SamplePool(); } return _instance; } private SamplePool ( ) { _pool = new Stack(); } public SamplePortType borrowObject ( ) { if ( _pool.empty() ) { return new SampleClass(); } else { return (SamplePortType)_pool.pop(); } } public void returnObject ( SamplePortType obj ) { _pool.push ( obj ); } private Stack _pool; }; public class AOPHandler implements InvocationHandler { static private SamplePortType _orgObject = null; public static SamplePortType getObject ( ) { if ( null == _orgObject ) _orgObject = new SampleClass(); return (SamplePortType)Proxy.newProxyInstance( _orgObject.getClass().getClassLoader(), _orgObject.getClass().getInterfaces(), new AOPHandler() ); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { SamplePortType obj = SamplePool.getInstance().borrowObject(); Object result = null; result = method.invoke(obj, args); SamplePool.getInstance().returnObject ( obj ); return result; } static public void main ( String args[] ) { SamplePortType obj = AOPHandler.getObject(); obj.helloWorld ( ); } } <p> |
相關文章
- 使用反射-動態建立物件及呼叫物件方法反射物件
- JS_建立物件+呼叫物件方法JS物件
- 使用DBMS_SHARED_POOL包將物件固定到共享池物件
- JavaScript 包裝物件JavaScript物件
- 物件,包裝類物件
- JavaScript包裝物件JavaScript物件
- .NET Core 物件池的使用物件
- go物件導向方法的呼叫Go物件
- JavaScript 複習之包裝物件,Boolean物件,Number物件JavaScript物件Boolean
- File 物件呼叫 renameTo() 方法失敗原因物件
- JavaScript學習筆記023-物件方法0包裝物件0靜態屬性JavaScript筆記物件
- dbms_random包呼叫隨機數的方法:random隨機
- java反射構建物件和方法的反射呼叫Java反射物件
- 面對物件3-回顧方法的呼叫物件
- Proxy.newProxyInstance原始碼探究原始碼
- python 物件池Python物件
- Unity——物件池管理Unity物件
- 常見物件-基本型別包裝類物件型別
- python 使用pip安裝使用國內映象加速下載安裝包的方法Python
- 將一個物件多次放入set不呼叫equals方法物件
- Laravel 使用依賴注入呼叫方法Laravel依賴注入
- 利用Proxy.newProxyInstance實現AOP
- 函式物件、裝飾器、閉包函式函式物件
- javascript變數物件函式呼叫棧作用域閉包等細解!JavaScript變數物件函式
- [JAVA] Java物件導向之包裝類,拆箱、裝箱Java物件
- 物件池Pools優化物件優化
- netty Recycler物件池Netty物件
- 一種面嚮物件語言的方法呼叫過程。物件
- PHP通過反射實現物件的成員方法呼叫PHP反射物件
- 執行緒池、連線池、物件池從0到1執行緒物件
- 使用使用rundll32 呼叫指定dll的方法
- 安裝R包常見的方法
- Vue原始碼學習二 ———— Vue原型物件包裝Vue原始碼原型物件
- 裝飾者模式-動態的包裝原有物件的行為模式物件
- Java包呼叫問題Java
- JS中資料型別、內建物件、包裝型別物件、typeof關係JS資料型別物件
- 物件池簡單實現物件
- 物件池與享元模式物件模式