亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java字節碼深入解析 || 使用Intellij idea如何快速查看Java類字節碼

2019-11-14 11:01:24
字體:
來源:轉載
供稿:網友

                                                                                                                                   java字節碼深入解析

一:Java字節代碼的組織形式

  類文件{

  OxCAFEBABE,小版本號,大版本號,常量池大小,常量池數組,訪問控制標記,當前類信息,父類信息,實現的接口個數,實現的接口信息數組,域個數,域信息數組,方法個數,方法信息數組,屬性個數,屬性信息數組

  }

  二:查看方法 --- javap命令

  例子:有一個Java類Demo.java

public class Demo {     PRivate String str1;     private String str2;     private int num1;     private int num2;     public static final String STATIC_DATA = "hello world";          private void sayHello1(){         System.out.println("this is method1...");     }     private void sayHello2(){         System.out.println("this is method2...");     }     public void sayHello3(){         System.out.println("this is method3...");     } }

  通過jdk自帶的反編譯工具命令 javap 可以查看class文件的字節碼信息

D:/>javap -verbose Demo >> Demo.txt

  Demo.txt:

Compiled from "Demo.java" public class Demo extends java.lang.Object   SourceFile: "Demo.java"   minor version: 0   major version: 49       Constant pool: const #1 = class      #2;   //  Demo const #2 = Asciz     Demo; const #3 = class      #4;   //  java/lang/Object const #4 = Asciz     java/lang/Object; const #5 = Asciz     str1; const #6 = Asciz     Ljava/lang/String;; const #7 = Asciz     str2; const #8 = Asciz     num1; const #9 = Asciz     I; const #10 = Asciz   num2; const #11 = Asciz   STATIC_DATA; const #12 = Asciz   ConstantValue; const #13 = String  #14; //  hello world const #14 = Asciz   hello world; const #15 = Asciz   <init>; const #16 = Asciz   ()V; const #17 = Asciz   Code; const #18 = Method       #3.#19;   //  java/lang/Object."<init>":()V const #19 = NameAndType    #15:#16;//  "<init>":()V const #20 = Asciz   LineNumberTable; const #21 = Asciz   LocalVariableTable; const #22 = Asciz   thisconst #23 = Asciz   LDemo;; const #24 = Asciz   sayHello1; const #25 = Field   #26.#28;  //  java/lang/System.out:Ljava/io/PrintStream; const #26 = class    #27; //  java/lang/System const #27 = Asciz   java/lang/System; const #28 = NameAndType    #29:#30;//  out:Ljava/io/PrintStream; const #29 = Asciz   out; const #30 = Asciz   Ljava/io/PrintStream;; const #31 = String  #32; //  this is method1... const #32 = Asciz   this is method1...; const #33 = Method       #34.#36;  //  java/io/PrintStream.println:(Ljava/lang/String;)V const #34 = class    #35; //  java/io/PrintStream const #35 = Asciz   java/io/PrintStream; const #36 = NameAndType    #37:#38;//  println:(Ljava/lang/String;)V const #37 = Asciz   println; const #38 = Asciz   (Ljava/lang/String;)V; const #39 = Asciz   sayHello2; const #40 = String  #41; //  this is method2... const #41 = Asciz   this is method2...; const #42 = Asciz   sayHello3; const #43 = String  #44; //  this is method3... const #44 = Asciz   this is method3...; const #45 = Asciz   SourceFile; const #46 = Asciz   Demo.java;   { public static final java.lang.String STATIC_DATA;   Constant value: String hello world public Demo();   Code:    Stack=1, Locals=1, Args_size=1    0:      aload_0    1:      invokespecial  #18; //Method java/lang/Object."<init>":()V    4:      return   LineNumberTable:    line 2: 0   LocalVariableTable:    Start  Length  Slot  Name   Signature    0      5      0    this       LDemo;   public void sayHello3();   Code:    Stack=2, Locals=1, Args_size=1    0:      getstatic   #25; //Field java/lang/System.out:Ljava/io/PrintStream;    3:      ldc   #43; //String this is method3...    5:      invokevirtual  #33; //Method java/io/PrintStream.println:(Ljava/lang/String;)V    8:      return   LineNumberTable:    line 17: 0    line 18: 8   LocalVariableTable:    Start  Length  Slot  Name   Signature    0      9      0    this       LDemo; }

解析:

  1、版本號 major version: 49 //java版本 jdk1.6顯示的是50, jdk1.5顯示的是49,jdk1.4顯示的是58 , 高版本能執行低版本的class文件

  2、常量池Constant pool

  Method:方法

  Field:字段

  String:字符串

  Asciz:簽名如<init>由jvm調用,其他是不能夠去調用它的

  NameAndType:變量名的類型

  Class:類

  通過字節碼,我們可以看到Demo類 繼承于java.lang.Object,如果類中沒有顯式聲明構造函數的話,編譯器會插入一個缺省無參的構造函數(構造函數在JVM級別是顯示成<init>的普通函數)。

  三:檢測代碼的效率問題

  學習Java的過程中,都會了解到字符串合并時要用到StringBuffer 來代替String,那下面就來通過Java字節碼來驗證兩種方式的效率性。

  例子:一個Java類 TestString.java

<strong>public class TestString {     public String testString(String str1, String str2){        return str1 + str2;     }     public String testStringBuffer(StringBuffer sb, String str){        return sb.append(str).toString();     } }  </strong>

  javap –c TestString 后字節碼信息:

Compiled from "TestString.java" public class TestString extends java.lang.Object{ public TestString();   Code:    0:      aload_0    1:      invokespecial  #8; //Method java/lang/Object."<init>":()V    4:      return   public java.lang.String testString(java.lang.String, java.lang.String);   Code:    0:      new #16; //class java/lang/StringBuilder    3:      dup    4:      aload_1    5:      invokestatic    #18; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;    8:      invokespecial  #24; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V    11:     aload_2    12:    invokevirtual  #27; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;    15:    invokevirtual  #31; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;    18:    areturn   public java.lang.String testStringBuffer(java.lang.StringBuffer, java.lang.String);   Code:    0:      aload_1    1:      aload_2    2:      invokevirtual  #40; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;    5:      invokevirtual  #45; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;    8:      areturn }

  從上面編譯后的字節碼信息可以看出來,方法testString 調用了五個方法:new 、invokestatic 、invokespecial 和兩個invokevirtual ; 而testStringBuffer 方法只調用了兩個invokevirtual 方法。第一個方法比第二個方法多做了好多工作,其效率當然是要低的。而且我們從java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

  可以看出來其實對于String字符串合并,內部還是轉化為StringBuilder的方法調用,這是因為String是長度不可變的,所以不如直接采用StringBuilder(與StringBuffer 長度都是可變的,只不過前者是非線程安全,后者是線程安全)進行字符串合并。

       

                                                                 使用Intellij idea如何快速查看Java類字節碼

1、打開File-Settings

2:打開Tools-External Tools,右側點擊綠色“+”

3:填寫一些內容規則:Name是在類中,右鍵時使用時的名稱

4:代碼處右鍵,即可找到添加的功能

5、通過jdk自帶的反編譯工具命令 javap 可以查看class文件的字節碼信息

-verbose

或者

-c

都可以,詳情可以查看javap命令如何使用


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产99精品国自产| 欧美黄色性视频| 国产一区二区三区视频免费| 欧美综合一区第一页| 亚洲欧美制服综合另类| 欧美成人合集magnet| 欧美精品在线网站| 亚洲国产精久久久久久| 国产成人+综合亚洲+天堂| 国产精品va在线播放我和闺蜜| 色噜噜久久综合伊人一本| 国产成人福利网站| 日韩国产欧美精品在线| 91中文在线观看| 国产一区二区三区在线视频| 欧美精品九九久久| 国产精品久久久久久久app| 精品国产1区2区| 福利视频导航一区| 国产成人精品在线视频| 精品亚洲一区二区三区在线播放| 国产精品久久色| 欧美国产精品日韩| 亚洲黄色免费三级| 久久精品成人一区二区三区| 38少妇精品导航| 一区三区二区视频| 日韩精品在线免费播放| 91av在线播放| 中文字幕在线观看日韩| 精品久久久中文| 日韩欧美在线视频| 欧美日韩在线视频一区| 国产一区二区在线播放| 97精品国产97久久久久久| 欧美片一区二区三区| 日韩精品中文字幕在线播放| 欧美亚洲国产日本| 亚洲精品免费一区二区三区| 国产精品视频网站| 日韩免费观看高清| 成人黄色片在线| 一个人看的www欧美| 日韩欧美精品网址| 热99在线视频| 一区二区三区视频免费| 欧美性猛交99久久久久99按摩| 国内精品久久久久影院 日本资源| 亚洲日本欧美日韩高观看| 91久久国产综合久久91精品网站| 亚洲精品久久久久久久久久久久| 国产狼人综合免费视频| 久久精品视频在线观看| 亚洲男人天堂2024| 欧美国产日本在线| 狠狠久久亚洲欧美专区| 88国产精品欧美一区二区三区| 红桃av永久久久| 久久精品视频播放| 92福利视频午夜1000合集在线观看| 亚洲欧美日韩国产中文| 欧美自拍视频在线观看| 国产成人av在线| 两个人的视频www国产精品| 精品福利免费观看| 欧美日韩另类视频| 亚洲久久久久久久久久久| 国产成人在线一区二区| 国产亚洲aⅴaaaaaa毛片| 国产成人在线播放| 91日本视频在线| 青青草99啪国产免费| 国产91久久婷婷一区二区| 97激碰免费视频| 日韩人体视频一二区| 性色av一区二区三区免费| 成人欧美一区二区三区黑人| 欧美激情视频在线免费观看 欧美视频免费一| 久久精品99久久香蕉国产色戒| 欧美一区在线直播| 欧美日韩精品中文字幕| 亚洲精品成人免费| 久久综合伊人77777尤物| 成人精品久久久| 91久久精品美女高潮| 成人疯狂猛交xxx| 中文字幕亚洲一区二区三区五十路| 色综合男人天堂| 亚洲人午夜色婷婷| 九九精品在线视频| 在线丨暗呦小u女国产精品| 久久综合久久美利坚合众国| 91免费国产网站| 国产精品日韩在线| 日本国产精品视频| 国产精品成久久久久三级| 欧美日韩免费区域视频在线观看| 91国在线精品国内播放| 69视频在线播放| 精品久久久久久久久久ntr影视| 国产成人精品一区二区三区| 最近2019年日本中文免费字幕| 亚洲国产成人在线视频| 欧美大肥婆大肥bbbbb| 精品视频在线观看日韩| 亚洲精品国产suv| 亚洲爱爱爱爱爱| 中文字幕亚洲综合久久筱田步美| 91九色综合久久| 日韩欧美成人免费视频| 欧美综合在线观看| 亚洲精品国产精品国自产观看浪潮| 亚洲深夜福利在线| 亚洲色图15p| 国产精品免费久久久久久| 久久97精品久久久久久久不卡| 动漫精品一区二区| 久久久91精品国产| 国产精品18久久久久久麻辣| 国外成人免费在线播放| 亚洲国产成人爱av在线播放| 亚洲综合中文字幕在线观看| 久精品免费视频| 欧美激情三级免费| 精品福利一区二区| 精品av在线播放| 这里只有精品丝袜| 亚洲欧美激情精品一区二区| 欧美影院在线播放| 欧美日韩久久久久| 在线免费看av不卡| 国产日韩欧美在线视频观看| 成人激情电影一区二区| 国产一区二区三区在线| 久久视频在线观看免费| 亚洲精品国产精品乱码不99按摩| 久久精品免费电影| 国产精品久久久久aaaa九色| 久久久久久久久久国产精品| 国产精品国产三级国产aⅴ浪潮| 国产亚洲精品美女久久久| 久久99精品久久久久久噜噜| 欧美日韩在线视频观看| 精品一区电影国产| 午夜精品久久久久久久白皮肤| 俺也去精品视频在线观看| 亚洲激情自拍图| 91九色国产社区在线观看| 日本欧美中文字幕| 国产91ⅴ在线精品免费观看| 欧美激情一区二区三区高清视频| 91精品国产自产在线| 国产精品美乳在线观看| 久久精品亚洲94久久精品| 一区二区三区国产在线观看| 日本在线精品视频| 欧美激情2020午夜免费观看| 欧美黄色成人网| 欧美精品情趣视频| 欧美日韩性视频在线| 亚洲国产精品99久久| 欧美专区福利在线| 亚洲精品有码在线| 91精品视频在线|