一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

分析Java .class文件

 catph 2011-04-19
這章的一個(gè)例子雖然簡單,但是我覺的很有一定代表性。例子如下:

1:class Act {
2:   public static void doMathForever(int m) {
3:      int i = 0;
4:     int n=4>3?1:0;
5:        for (;;) {
6:           i += 1;
7:            i *= 2;
8:       }
9:    }
10:}


我用javap -verbose Act查看,代碼如下:(紅色為自己加上的注解)
Compiled from "Act.java"     
因 為編譯原文件不一定必須與java語言相關(guān),可以使用其他語言來編寫程序,然后將其編譯為class文件,所以這里要寫上Act.java而不是Act. 呵呵,想來以前為什么javac 來編譯源文件時(shí)一定要加.java,而java 執(zhí)行時(shí)就不需要加.java了,當(dāng)時(shí)就是搞不懂,現(xiàn)在明白了。
class Act extends java.lang.Object
  SourceFile: "Act.java"
SourceFile屬性,它提供了產(chǎn)生class文件的源文件的名稱,它是一個(gè)可選的項(xiàng),為什么說它是可選項(xiàng)的,因?yàn)閏lass可以自己用UE等工具寫。
  minor version: 0
  major version: 49
版本號(hào):我用的是5.0的,出來的major version 是49,書上說1.0或1.2是45,1.4我想可能是48 吧。呵呵,還沒有試過。
  Constant pool:
這個(gè)是常量池,剛看書的時(shí)候我還以為常量池放的一定是常量。錯(cuò)。
常量池就是該類型所用常量的一個(gè)有序集合,包括直接常量(String,integer,floating  point常量)和對(duì)其他類型、字段和方法的符號(hào)引用。
const #1 = Method #3.#12; //  java/lang/Object."<init>":()V
因?yàn)镃onstant pool#0是不用的,所以只能從#1開始,但不知為什么第一個(gè)是Method而不是class,我現(xiàn)在還不明白。
const #2 = class #13; //  Act
CONSTANT_Class是對(duì)一個(gè)類或接口的符號(hào)引用。這個(gè)是指向#13
const #3 = class #14; //  java/lang/Object
const #4 = Asciz <init>;
 這個(gè)Asciz應(yīng)該表示是CONSTANT_Utf8吧,因?yàn)镃 ONSTANT_Utf8可以是存儲(chǔ)四種基本信息類型:文字字符串、被定義的類和接口描述、對(duì)其他類或接口的符號(hào)引用以及屬性相關(guān)的字符串。
<init>是實(shí)例的初始化方法,是實(shí)例調(diào)用方法前必須要<init>的,
<clinit>是類的初始化方法。
const #5 = Asciz ()V;
此<init>的描述符,()V表示<init>沒有帶參數(shù),返回的是void型的。
書上介紹:
()I  int getSize()  
() Ljava/lang/String      String toString()

const #6 = Asciz Code;
Code在所有不是抽象或者本地方法的method_info信息中,都存在一個(gè)Code_attribute表。
但是我試一下在抽象的方法中同樣也有code的啊,不懂中。
const #7 = Asciz LineNumberTable;
LineNumberTable屬性建立了方法字節(jié)碼流偏移量和源代碼行號(hào)之間的映射關(guān)系。關(guān)于這一點(diǎn),我在下面詳細(xì)談到。
const #8 = Asciz doMathForever;
#8 字段名和方法名以簡單名稱出現(xiàn)在常量池的入口中,存的時(shí)候存簡單名字,調(diào)用的時(shí)候要加 上全限定名
const #9 = Asciz (I)V;
doMathForover的描述符,參數(shù)是int類型,返回值是void類型
const #10 = Asciz SourceFile;
const #11 = Asciz Act.java;
const #12 = NameAndType #4:#5;//  "<init>":()V
NameAndType指向字段或者方法的符號(hào)引用的一部分。為什么沒有指向#8,#9呢?不懂中。
const #13 = Asciz Act;
const #14 = Asciz java/lang/Object;

#13,#14 CONSTANT_Utf8_info 表的入口,容納了 類/接口全限定名等信息。用“/”代替“.”。在class文件的this_class字段是 對(duì)常量池的一個(gè)引用,指向了常量池中CONSTANT_ClASS_info表,該表由兩項(xiàng)組成,即標(biāo)簽和name_index。在這個(gè)例子 里,this_class的值為2,也就是常量池里的第二項(xiàng),這項(xiàng)標(biāo)簽是class,name_index是13,即指向常量池的第13項(xiàng)。第13項(xiàng)里就 有當(dāng)前類的全限定名。
{
Act();
  Code:
   Stack=1, Locals=1, Args_size=1
需要的棧為1個(gè),只是this的存取;本地變量為1個(gè),也是this,方法的參數(shù)是1個(gè),也是this傳入。
   0: aload_0
從局部變量0中裝載引用類型。
   1: invokespecial #1; //Method java/lang/Object."<init>":()V
調(diào)用Object的<init>方法,因?yàn)槊總€(gè)類都是繼承Object,所以實(shí)例時(shí)都要調(diào)用Object的<init>方法。
   4: return
  LineNumberTable:
   line 1: 0

public static void doMathForever(int);
  Code:
   Stack=2, Locals=3, Args_size=1
   0: iconst_0 
將i 壓入棧
   1: istore_1 
放i
   2: iconst_1
同上
   3: istore_2
   4: iinc 1, 1  i++
  7   iload_1 從局部變量1中裝載int類型值。
   8: iconst_2
   9: imul
   10: istore_1
   11: goto 4
  LineNumberTable:
   line 3: 0  源代碼第3行對(duì)應(yīng)Code中的0偏移量。
   line 4: 2
   line 6: 4
   line 7: 7
   line 8: 11

}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    99日韩在线视频精品免费| 国产精品久久精品国产| 欧美乱妇日本乱码特黄大片| 欧美韩日在线观看一区| 色哟哟国产精品免费视频| 黄片在线免费观看全集| 国产福利在线播放麻豆| 日本不卡一区视频欧美| 人妻乱近亲奸中文字幕| 欧美日韩国产精品第五页| 午夜视频成人在线免费| 久久99热成人网不卡| 亚洲第一香蕉视频在线| 日韩高清一区二区三区四区| 亚洲国产成人爱av在线播放下载 | 日韩在线视频精品中文字幕| 国产精品白丝一区二区| 国产成人精品视频一二区| 天堂热东京热男人天堂| 国产精品成人又粗又长又爽| 国产高清一区二区不卡| 黄色国产精品一区二区三区| 亚洲视频在线观看你懂的| 久久成人国产欧美精品一区二区| 2019年国产最新视频| 果冻传媒在线观看免费高清| 99久久精品午夜一区二区| 欧美日韩少妇精品专区性色| 国产又粗又猛又大爽又黄| 国产亚洲系列91精品| 国产精品人妻熟女毛片av久| 国产精品推荐在线一区| 老司机精品视频在线免费看| 国产亚洲不卡一区二区| 成人免费观看视频免费| 久久精品福利在线观看| 国产一级内射麻豆91| 综合久综合久综合久久| 麻豆蜜桃星空传媒在线观看| 99久久精品午夜一区| 欧美精品在线观看国产|