国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

javap簡介

2019-11-18 11:51:06
字體:
供稿:網(wǎng)友

  作者: golder    
  
   也許我們很少會使用到javap工具,因為現(xiàn)在有很多好的反編譯工具,但是我在此介紹這個工具不是使用它進行反編譯,而是查看java編譯器為我們生成的字節(jié)碼,通過比較字節(jié)碼和源代碼,我們可以發(fā)現(xiàn)很多的問題,一個很重要的作用就是了解很多編譯器內(nèi)部的工作機制,在筆者以前的幾篇文章中就是借助此工具的,本站有這些文章的原文《深入剖析java類的構(gòu)造方式》和《使用String還是StringBuffer》。
  下面我們通過具體的一個例子來簡單的講講這個工具的作用,你不需要很深入的使用,這個簡單的介紹和簡單的使用就可以使你受益非淺。
  源代碼:
  class StringTest
  {
  public static void main(String[] args)
  {
  String result="";
  result+="ok";
  }
  }
  在反編譯前你當(dāng)然需要先編譯這個類了:javac -g StringTest.java(使用-g參數(shù)是因為要得到下面javap -l時的輸出需要使用此選項)
  編譯完成后,我們在使用不同的選項看看不同的效果:
  
  1、先看看最簡單的不帶參數(shù)的情況:javap StringTest:
  
  Compiled from StringTest.java
  class StringTest extends java.lang.Object {
  StringTest();
  public static void main(java.lang.String[]);
  }
  不帶參數(shù)的情況將答應(yīng)類的public信息,包括成員和方法
  從上面的輸出中我們確定了兩個知識:假如類沒有顯示的從其它類派生那么它就是從Object派生;假如沒有為類顯示的申明構(gòu)造方法,那么編譯器將為之生成一個缺省構(gòu)造方法(不帶參數(shù)的構(gòu)造方法)
  
  2、javap -c StringTest:
  
  Compiled from StringTest.java
  class StringTest extends java.lang.Object {
  StringTest();
  public static void main(java.lang.String[]);
  }
  Method StringTest()
  0 aload_0
  1 invokespecial #1 <Method java.lang.Object()>
  4 return
  
  Method void main(java.lang.String[])
  0 ldc #2 <String "">
  2 astore_1
  3 new #3 <Class java.lang.StringBuffer>
  6 dup
  7 invokespecial #4 <Method java.lang.StringBuffer()>
  10 aload_1
  11 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
  14 ldc #6 <String "ok">
  16 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
  19 invokevirtual #7 <Method java.lang.String toString()>
  22 astore_1
  23 return
  帶-p參數(shù)將額外的打印字節(jié)碼信息
  前面的和不帶參數(shù)的輸出一樣,后面的顯示了方法的具體的字節(jié)碼,從這個輸出里面我們又可以了解更多的內(nèi)容,首先是編譯器生成的的缺省構(gòu)造方法的內(nèi)容為調(diào)用父類的構(gòu)造方法super()(需要說明的是使用DJ反編譯的源代碼中這個缺省構(gòu)造方法沒有這個調(diào)用,這可能是該反編譯器的一種優(yōu)化),main()方法的字節(jié)碼信息的內(nèi)容可以參考《使用String還是StringBuffer》一文的敘述。
  
  3、javap -l StringTest :
  
  Compiled from StringTest.java
  class StringTest extends java.lang.Object {
  StringTest();
  public static void main(java.lang.String[]);
  }
  
  Line numbers for method StringTest()
  line 1: 0
  
  Local variables for method StringTest()
  StringTest this pc=0, length=5, slot=0
  
  Line numbers for method void main(java.lang.String[])
  line 5: 0
  line 6: 3
  line 7: 23
  
  Local variables for method void main(java.lang.String[])
  java.lang.String[] args pc=0, length=24, slot=0
  java.lang.String result pc=3, length=20, slot=1
  -l參數(shù)將顯示行號和局部變量表
  從上面的輸出中我們可以得到方法中的變量和方法的源代碼對于字節(jié)碼信息的,例如對應(yīng)main()方法,它的變量為輸入?yún)?shù)args以及局部變量result,方法的源代碼的第5行對應(yīng)字節(jié)碼的第0個偏移量,第5行對應(yīng)字節(jié)碼的第3個偏移量,而第7行對應(yīng)字節(jié)碼的第23偏移量(參看javap -c的輸出前面的偏移量),第7行實際是沒有語句的,但是有一個隱含的return,而偏移量23實際對應(yīng)的也是return調(diào)用
  
  4、javap -p StringTest:
  
  Compiled from StringTest.java
  class StringTest extends java.lang.Object {
  StringTest();
  public static void main(java.lang.String[]);
  }
  -p參數(shù)將額外的打印PRivate成員和方法的信息,因為這個類沒有因此輸出相同
  
  這幾個參數(shù)幾乎就可以構(gòu)成javap的最常使用的集合,最常用的應(yīng)該還是-c選項,因為可以打印字節(jié)碼的信息,關(guān)于這些字節(jié)碼的具體涵義在Java 虛擬機規(guī)范中定義.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邢台市| 石楼县| 辰溪县| 卓资县| 卫辉市| 沙洋县| 新晃| 贵溪市| 南乐县| 融水| 西城区| 沁源县| 报价| 祥云县| 潞西市| 大安市| 昌都县| 商水县| 扎鲁特旗| 二手房| 淅川县| 买车| 黄龙县| 天镇县| 邳州市| 赣州市| 塔河县| 日照市| 浏阳市| 黄梅县| 集安市| 凤台县| 交口县| 平湖市| 垣曲县| 云龙县| 克拉玛依市| 舒兰市| 确山县| 六安市| 三都|