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

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

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

    dyerac  
    dyerac In Java
    公告

    日歷
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678
    統(tǒng)計
    • 隨筆 - 36
    • 文章 - 10
    • 評論 - 94
    • 引用 - 0

    導(dǎo)航

    常用鏈接

    留言簿(5)

    隨筆分類(49)

    隨筆檔案(36)

    文章分類(11)

    文章檔案(10)

    相冊

    dyerac

    搜索

    •  

    積分與排名

    • 積分 - 79215
    • 排名 - 705

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

     
    要讓Java這個面向“對象”的世界正常運作,創(chuàng)建對象就是一項不可或缺的操作。

    public class NewMain {
        public static void main(String[] args) {
            new Object();
        }
    }

    用javap反編譯上面的代碼,我們可以得到下面的指令,這里省去了javac暗中創(chuàng)建的構(gòu)造函數(shù)。

    public class NewMain extends java.lang.Object{
        ...
    public static void main(java.lang.String[]);
      Code:
       0:   new     #3; //class java/lang/Object
       3:   invokespecial   #8; //Method java/lang/Object."<init>":()V
       6:   return
    }

    從這段代碼中,我們可以清晰的看出創(chuàng)建對象(new)和調(diào)用構(gòu)造函數(shù)(invokespecial)兩個過程。關(guān)于這個問題,我在《對象的生命》中曾經(jīng)進行過討論。

    既然javac將一個new的動作被解釋為兩條指令,那在JVM的層面上,我們當然就可以將它們分開。下面是一段沒什么實際用途的代碼,只是證明這個觀點可行性。

    public class NewGenerator {
        public static void main(String[] args) throws Exception {
            String className = "New";
            ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
            cw.visit(Opcodes.V1_2, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
            Method m = Method.getMethod("void main (String[])");
            GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, m, null, null, cw);
            mg.newInstance(Type.getType(Object.class));
            Label label = mg.newLabel();
            mg.ifNonNull(label);
            mg.mark(label);
            mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
            mg.push("new object is not null");
            mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println(java.lang.String)"));
            mg.pop();
            mg.returnValue();
            mg.endMethod();
            cw.visitEnd();

            OutputStream os = null;
            try {
                os = new FileOutputStream(className + ".class");
                os.write(cw.toByteArray());
            } finally {
                if (os != null) {
                    os.close();
                }
            }
        }
    }

    這段代碼生成的類是能夠運行的,有興趣的可以自己試一下。這段代碼的作用是new出一個對象之后,如果這個對象非空的話,就會產(chǎn)生一個輸出:
        new object is not null

    當然,如果嘗試用這個對象做一些其它的操作,會有錯誤等待著我們,因為這個對象并不是一個完整的對象。在JVM規(guī)范中有相關(guān)的解釋:new指令并不能完整創(chuàng)建出一個新的對象,直到對未初始化的對象調(diào)用了實例初始化方法才會完成實例的創(chuàng)建。這段代碼也正好符合《對象的生命》中的解釋,它只是負責做出申請內(nèi)存。當然,在JVM中,它的實際工作要略多一些,如果這個對象的類沒有加載,就會加載相應(yīng)的類。
    posted on 2007-08-13 18:52 dyerac in java... 閱讀(379) 評論(0)  編輯  收藏 所屬分類: JavaSE
     
    Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 国产亚洲一卡2卡3卡4卡新区 | 色片在线免费观看| 亚洲国产精品无码专区| 亚洲免费日韩无码系列| 亚洲日韩在线观看免费视频| 午夜成人无码福利免费视频| 亚洲国产aⅴ综合网| 久久久久久av无码免费看大片| 久久精品国产亚洲一区二区三区| 一级毛片aa高清免费观看| 亚洲综合无码精品一区二区三区| 免费无码又爽又刺激网站| 久久精品国产亚洲AV无码偷窥| 国产91色综合久久免费| 亚洲码欧美码一区二区三区| 国产免费牲交视频| selaoban在线视频免费精品| 亚洲国产精品SSS在线观看AV| 少妇无码一区二区三区免费| 亚洲一级免费视频| 日本免费一本天堂在线| WWW国产成人免费观看视频| 亚洲国产日韩一区高清在线| 免费专区丝袜脚调教视频| 亚洲欧美日韩国产精品一区| 亚洲毛片网址在线观看中文字幕| 你懂的网址免费国产| 亚洲人成在久久综合网站| 午夜亚洲av永久无码精品| 国产一区二区免费| 亚洲一线产品二线产品| www.亚洲色图.com| 99视频精品全部免费观看| 亚洲成a∧人片在线观看无码| 亚洲一区精品无码| 中国在线观看免费国语版| 牛牛在线精品免费视频观看| 亚洲AV一宅男色影视| 成年女人视频网站免费m| a级毛片在线免费| 亚洲成a∨人片在无码2023|