年過三十仍在路上

          平凡而不平庸,低調而不頹廢 兩耳不聞人聲,只有硬盤在歌唱

          常用鏈接

          統計

          印刷報價

          印刷設備

          友情鏈接

          最新評論

          實現不調用構造方法創建對象

          如果一個類沒有參數為空的構造方法時候,那么你直接調用newInstance方法試圖得到一個實例對象的時候是會拋出異常的。

          能不能有辦法繞過構造方法來實例化一個對象呢?

          Objenesis 為其提供了在四個不同的jvm上的解決方案。

          首先我們看看四個不同的jvm平臺:
          •  Sun Hotspot VM, versions 1.3, 1.4, 1.5 and 1.6
          •  GCJ version 3.4.4 (tested on Windows/Cygwin)
          •  BEA JRockit versions 7.0 (1.3.1), 1.4.2 and 1.5
          •  Aonix PERC (no serialization support), tested on version 5.0.0667

          從運行平臺上得到幾個關鍵的參數,如下:

          /** JVM version */
          protected static final String VM_VERSION = System.getProperty("java.runtime.version");

          /** JVM version */
          protected static final String VM_INFO = System.getProperty("java.vm.info");

          /** Vendor version */
          protected static final String VENDOR_VERSION = System.getProperty("java.vm.version");

          /** Vendor name */
          protected static final String VENDOR = System.getProperty("java.vm.vendor");

          /** JVM name */
          protected static final String JVM_NAME = System.getProperty("java.vm.name");

          然后根據得到的參數進行判斷:

          根據得到平臺提供的jvm版本和供應商來選擇不同的實例化策略。
          說實話,這幾個平臺里面我還是對sun公司提供的相對熟悉一些,所以除了sun公司提供的jvm對于的實例策略我在這里就不介紹了,
          大家有興趣的話可以去項目主頁下載下來細細研究。

          現在我們僅僅關注sun公司的,并且版本大于1.3的。
          版本為1.3的jvm具體實例化策略這里不做討論了,有興趣的可以去看objenesis的實現。

          代碼如下:
          import sun.reflect.ReflectionFactory;
          public class SunReflectionFactoryInstantiator implements ObjectInstantiator {

          private final Constructor mungedConstructor;

          public SunReflectionFactoryInstantiator(Class type) {

          ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
          Constructor javaLangObjectConstructor;

          try {
          javaLangObjectConstructor = Object.class.getConstructor((Class[]) null);
          }
          catch(NoSuchMethodException e) {
          throw new Error("Cannot find constructor for java.lang.Object!");
          }
          mungedConstructor = reflectionFactory.newConstructorForSerialization(type,
          javaLangObjectConstructor);
          mungedConstructor.setAccessible(true);
          }

          public Object newInstance() {
          try {
          return mungedConstructor.newInstance((Object[]) null);
          }
          catch(Exception e) {
          throw new ObjenesisException(e);
          }
          }
          }

          通過sun.reflect.ReflectionFactory這個類來實例化一個class那么就繞過了其類的構造方法,我們可以暫且稱之為繞道方式實例一個對象。
          希望上面的代碼能給大家起到一定的幫助,另外easymock的最新版本已經使用了Objenesis來實例化一個Class獲取對象。

          項目主頁:http://objenesis.googlecode.com/svn/docs/index.html

          posted on 2009-08-20 08:53 和風賽跑 閱讀(1793) 評論(5)  編輯  收藏

          評論

          # re: 實現不調用構造方法創建對象 2009-08-20 09:11 BoBo小說網

          值得參考下  回復  更多評論   

          # re: 實現不調用構造方法創建對象 2009-08-20 09:12 BoBo小說網

          實際應用中還是很多的  回復  更多評論   

          # re: 實現不調用構造方法創建對象 2009-08-20 09:53 隔葉黃鶯

          對的,在 XStream 轉換 XML 或 JSON 到 JavaBean 時用得就是 sun.reflect.ReflectionFactory,所以不依賴于 JavaBean 的構造函數。  回復  更多評論   

          # re: 實現不調用構造方法創建對象 2009-08-21 17:46 個性藝術簽名

          實際應用中還是很多的  回復  更多評論   

          # re: 實現不調用構造方法創建對象 2009-08-25 08:50 找個美女做老婆

          Java樂園學習網站: http://www.javaly.cn

          有大量的學習文章和視頻教程,以及一些項目源碼

          Java樂園學習群: 81107233  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 莒南县| 巩留县| 平南县| 崇信县| 清河县| 武汉市| 康平县| 潮州市| 介休市| 依安县| 宁海县| 慈溪市| 盐山县| 仪征市| 孝义市| 博湖县| 忻州市| 西安市| 疏附县| 衡阳市| 渝中区| 宜都市| 奉贤区| 行唐县| 隆德县| 新乡市| 夏河县| 汨罗市| 且末县| 昆山市| 垫江县| 津南区| 开封市| 福海县| 怀仁县| 山西省| 贵定县| 楚雄市| 白朗县| 泾川县| 大埔县|