Java字节码深入解析

发表于:2011-12-06 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:周凡杨    来源:51Testing软件测试网采编

  一: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   this
  • const #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 20 
  •   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 170 
  •    line 188 
  •   LocalVariableTable: 
  •    Start  Length  Slot  Name   Signature 
  •    0      9      0    this       LDemo; 
  • }
  • 21/212>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号