<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
    統計
    • 隨筆 - 36
    • 文章 - 10
    • 評論 - 94
    • 引用 - 0

    導航

    常用鏈接

    留言簿(5)

    隨筆分類(49)

    隨筆檔案(36)

    文章分類(11)

    文章檔案(10)

    相冊

    dyerac

    搜索

    •  

    積分與排名

    • 積分 - 79233
    • 排名 - 705

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

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

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

    用javap反編譯上面的代碼,我們可以得到下面的指令,這里省去了javac暗中創建的構造函數。

    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
    }

    從這段代碼中,我們可以清晰的看出創建對象(new)和調用構造函數(invokespecial)兩個過程。關于這個問題,我在《對象的生命》中曾經進行過討論。

    既然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出一個對象之后,如果這個對象非空的話,就會產生一個輸出:
        new object is not null

    當然,如果嘗試用這個對象做一些其它的操作,會有錯誤等待著我們,因為這個對象并不是一個完整的對象。在JVM規范中有相關的解釋:new指令并不能完整創建出一個新的對象,直到對未初始化的對象調用了實例初始化方法才會完成實例的創建。這段代碼也正好符合《對象的生命》中的解釋,它只是負責做出申請內存。當然,在JVM中,它的實際工作要略多一些,如果這個對象的類沒有加載,就會加載相應的類。
    posted on 2007-08-13 18:52 dyerac in java... 閱讀(380) 評論(0)  編輯  收藏 所屬分類: JavaSE
     
    Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 我要看免费的毛片| 免费下载成人电影| 亚洲av中文无码乱人伦在线咪咕| 男人和女人高潮免费网站| 免费AA片少妇人AA片直播| 亚洲精品无码日韩国产不卡?V| 日本黄页网址在线看免费不卡| 亚洲成?Ⅴ人在线观看无码| 两性色午夜视频免费网| 久久亚洲精品无码| 67194熟妇在线永久免费观看 | 九九精品成人免费国产片| JLZZJLZZ亚洲乱熟无码| free哆拍拍免费永久视频| 国产成人高清亚洲| 99视频精品全部免费观看| 亚洲国产成人91精品| 精品熟女少妇aⅴ免费久久| 亚洲自偷自拍另类图片二区 | 久久精品国产亚洲av影院| 日本免费电影一区| 最近免费中文字幕高清大全| 黄色毛片视频免费| 亚洲av无码片在线观看| 亚洲码国产精品高潮在线| 日韩免费观看的一级毛片| 亚洲免费一级视频| 免费无码又爽又刺激网站直播| 亚洲中文无码永久免费| 久久亚洲AV成人出白浆无码国产 | 四虎www免费人成| 久久99国产乱子伦精品免费| 新最免费影视大全在线播放| 亚洲成人激情小说| 亚洲美女在线观看播放| 亚洲国产无套无码av电影| 免费不卡中文字幕在线| 性盈盈影院免费视频观看在线一区| 99在线观看视频免费| 中国国产高清免费av片| 一级a性色生活片久久无少妇一级婬片免费放 |