<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: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 日韩在线视频线视频免费网站| 无码乱人伦一区二区亚洲一| 日韩高清在线免费观看| 91九色老熟女免费资源站| 91老湿机福利免费体验| 1000部夫妻午夜免费| 99视频在线免费看| **aaaaa毛片免费同男同女| 亚欧在线精品免费观看一区| 欧洲一级毛片免费| 毛色毛片免费观看| 精品国产一区二区三区免费看| 免费无码成人AV片在线在线播放| 好吊妞在线新免费视频| 日韩黄色免费观看| 亚洲国产高清精品线久久| 国产精品亚洲精品日韩已方| 亚洲熟妇无码另类久久久| 亚洲综合视频在线| 亚洲一区二区三区深夜天堂| 亚洲自偷自偷在线成人网站传媒| 亚洲AV日韩AV一区二区三曲| 男男gvh肉在线观看免费| 国产成人无码精品久久久久免费| 中文字幕在线视频免费| 久久久久久AV无码免费网站| 69式国产真人免费视频| 免费无码又爽又刺激高潮| 亚洲AV无码乱码在线观看牲色| 中文字幕亚洲一区| 91亚洲国产在人线播放午夜| 国产精品亚洲精品| 日本视频免费观看| 在线观看免费播放av片| 1000部啪啪毛片免费看| 午夜免费福利在线观看| 最新国产AV无码专区亚洲| 亚洲欧洲国产视频| 国产精品亚洲精品爽爽| 国内精品久久久久影院免费| 亚洲免费网站观看视频|