<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    年過三十仍在路上

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

    常用鏈接

    統(tǒng)計(jì)

    印刷報(bào)價(jià)

    印刷設(shè)備

    友情鏈接

    最新評(píng)論

    實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象

    如果一個(gè)類沒有參數(shù)為空的構(gòu)造方法時(shí)候,那么你直接調(diào)用newInstance方法試圖得到一個(gè)實(shí)例對(duì)象的時(shí)候是會(huì)拋出異常的。

    能不能有辦法繞過構(gòu)造方法來實(shí)例化一個(gè)對(duì)象呢?

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

    首先我們看看四個(gè)不同的jvm平臺(tái):
    •  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

    從運(yùn)行平臺(tái)上得到幾個(gè)關(guān)鍵的參數(shù),如下:

    /** 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");

    然后根據(jù)得到的參數(shù)進(jìn)行判斷:

    根據(jù)得到平臺(tái)提供的jvm版本和供應(yīng)商來選擇不同的實(shí)例化策略。
    說實(shí)話,這幾個(gè)平臺(tái)里面我還是對(duì)sun公司提供的相對(duì)熟悉一些,所以除了sun公司提供的jvm對(duì)于的實(shí)例策略我在這里就不介紹了,
    大家有興趣的話可以去項(xiàng)目主頁(yè)下載下來細(xì)細(xì)研究。

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

    代碼如下:
    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這個(gè)類來實(shí)例化一個(gè)class那么就繞過了其類的構(gòu)造方法,我們可以暫且稱之為繞道方式實(shí)例一個(gè)對(duì)象。
    希望上面的代碼能給大家起到一定的幫助,另外easymock的最新版本已經(jīng)使用了Objenesis來實(shí)例化一個(gè)Class獲取對(duì)象。

    項(xiàng)目主頁(yè):http://objenesis.googlecode.com/svn/docs/index.html

    posted on 2009-08-20 08:53 和風(fēng)賽跑 閱讀(1797) 評(píng)論(5)  編輯  收藏

    評(píng)論

    # re: 實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象 2009-08-20 09:11 BoBo小說網(wǎng)

    值得參考下  回復(fù)  更多評(píng)論   

    # re: 實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象 2009-08-20 09:12 BoBo小說網(wǎng)

    實(shí)際應(yīng)用中還是很多的  回復(fù)  更多評(píng)論   

    # re: 實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象 2009-08-20 09:53 隔葉黃鶯

    對(duì)的,在 XStream 轉(zhuǎn)換 XML 或 JSON 到 JavaBean 時(shí)用得就是 sun.reflect.ReflectionFactory,所以不依賴于 JavaBean 的構(gòu)造函數(shù)。  回復(fù)  更多評(píng)論   

    # re: 實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象 2009-08-21 17:46 個(gè)性藝術(shù)簽名

    實(shí)際應(yīng)用中還是很多的  回復(fù)  更多評(píng)論   

    # re: 實(shí)現(xiàn)不調(diào)用構(gòu)造方法創(chuàng)建對(duì)象 2009-08-25 08:50 找個(gè)美女做老婆

    Java樂園學(xué)習(xí)網(wǎng)站: http://www.javaly.cn

    有大量的學(xué)習(xí)文章和視頻教程,以及一些項(xiàng)目源碼

    Java樂園學(xué)習(xí)群: 81107233  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 男男AV纯肉无码免费播放无码| 国产免费av片在线看| 在线免费视频一区二区| 亚洲男女内射在线播放| 亚洲精品在线电影| 羞羞漫画页面免费入口欢迎你| 美女在线视频观看影院免费天天看 | 在线天堂免费观看.WWW| 国产AV无码专区亚洲AWWW| 亚洲精品第一国产综合精品| 人妻丰满熟妇无码区免费| 亚洲片一区二区三区| 国产一级a毛一级a看免费视频| 成人免费无码视频在线网站| 亚洲精品国产国语| 96免费精品视频在线观看| 亚洲最大AV网站在线观看| 日本免费人成网ww555在线| 亚洲成?v人片天堂网无码| 亚洲一区二区无码偷拍| 69av免费视频| 久久亚洲私人国产精品vA| 两个人看的www免费视频中文| 国产亚洲精品免费| 亚洲乱亚洲乱妇24p| 99久久久精品免费观看国产| 亚洲a在线视频视频| 成人性做爰aaa片免费看| 国产美女亚洲精品久久久综合| 日本一区二区免费看| 亚洲av日韩av无码av| 最近最新高清免费中文字幕| www.亚洲色图.com| 偷自拍亚洲视频在线观看99| 国产精品无码一区二区三区免费 | 久久精品亚洲中文字幕无码麻豆| 一二三四在线播放免费观看中文版视频 | 亚洲AV综合色区无码一区| 香蕉免费看一区二区三区| 亚洲无码视频在线| 手机永久免费的AV在线电影网|