利用javap进行反编译

javap可以查看java编译器为我们生成的字节码。 通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。

package com.ant;

public class HelloWorld{
	
	private String name;
	
	private static final String LANGUAGE = "Java";
	
	public HelloWorld(String name){
		this.name = name;
	}
	public static void main(String[] args){
		HelloWorld hw = new HelloWorld("Tom");
		hw.sayHelloWorld();
	}
	
	public void sayHelloWorld(){
		System.out.println(LANGUAGE+": "+name+" , HelloWorld !");
	}
}

javap -v com.ant.HelloWorld:

Classfile /D:/com/ant/HelloWorld.class
  Last modified 2016-11-1; size 837 bytes
  MD5 checksum e5ee3b20c3c6196f835eea02b3777e50
  Compiled from "HelloWorld.java"
public class com.ant.HelloWorld
  SourceFile: "HelloWorld.java"
  minor version: 0
  major version: 51
  flags: ACC_PUBLIC, ACC_SUPER

Constant pool:
   #1 = Methodref          #15.#31        //  java/lang/Object."<init>":()V
   #2 = Fieldref           #3.#32         //  com/ant/HelloWorld.name:Ljava/lang/String;
   #3 = Class              #33            //  com/ant/HelloWorld
   #4 = String             #34            //  Tom
   #5 = Methodref          #3.#35         //  com/ant/HelloWorld."<init>":(Ljava/lang/String;)V
   #6 = Methodref          #3.#36         //  com/ant/HelloWorld.sayHelloWorld:()V
   #7 = Fieldref           #37.#38        //  java/lang/System.out:Ljava/io/PrintStream;
   #8 = Class              #39            //  java/lang/StringBuilder
   #9 = Methodref          #8.#31         //  java/lang/StringBuilder."<init>":()V
  #10 = String             #40            //  Java: 
  #11 = Methodref          #8.#41         //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #12 = String             #42            //   , HelloWorld !
  #13 = Methodref          #8.#43         //  java/lang/StringBuilder.toString:()Ljava/lang/String;
  #14 = Methodref          #44.#45        //  java/io/PrintStream.println:(Ljava/lang/String;)V
  #15 = Class              #46            //  java/lang/Object
  #16 = Utf8               name
  #17 = Utf8               Ljava/lang/String;
  #18 = Utf8               LANGUAGE
  #19 = Utf8               ConstantValue
  #20 = String             #47            //  Java
  #21 = Utf8               <init>
  #22 = Utf8               (Ljava/lang/String;)V
  #23 = Utf8               Code
  #24 = Utf8               LineNumberTable
  #25 = Utf8               main
  #26 = Utf8               ([Ljava/lang/String;)V
  #27 = Utf8               sayHelloWorld
  #28 = Utf8               ()V
  #29 = Utf8               SourceFile
  #30 = Utf8               HelloWorld.java
  #31 = NameAndType        #21:#28        //  "<init>":()V
  #32 = NameAndType        #16:#17        //  name:Ljava/lang/String;
  #33 = Utf8               com/ant/HelloWorld
  #34 = Utf8               Tom
  #35 = NameAndType        #21:#22        //  "<init>":(Ljava/lang/String;)V
  #36 = NameAndType        #27:#28        //  sayHelloWorld:()V
  #37 = Class              #48            //  java/lang/System
  #38 = NameAndType        #49:#50        //  out:Ljava/io/PrintStream;
  #39 = Utf8               java/lang/StringBuilder
  #40 = Utf8               Java: 
  #41 = NameAndType        #51:#52        //  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  #42 = Utf8                , HelloWorld !
  #43 = NameAndType        #53:#54        //  toString:()Ljava/lang/String;
  #44 = Class              #55            //  java/io/PrintStream
  #45 = NameAndType        #56:#22        //  println:(Ljava/lang/String;)V
  #46 = Utf8               java/lang/Object
  #47 = Utf8               Java
  #48 = Utf8               java/lang/System
  #49 = Utf8               out
  #50 = Utf8               Ljava/io/PrintStream;
  #51 = Utf8               append
  #52 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
  #53 = Utf8               toString
  #54 = Utf8               ()Ljava/lang/String;
  #55 = Utf8               java/io/PrintStream
  #56 = Utf8               println
{
  public com.ant.HelloWorld(java.lang.String);
    flags: ACC_PUBLIC

    Code:
      stack=2, locals=2, args_size=2
         0: aload_0       
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0       
         5: aload_1       
         6: putfield      #2                  // Field name:Ljava/lang/String;
         9: return        
      LineNumberTable:
        line 9: 0
        line 10: 4
        line 11: 9

  public static void main(java.lang.String[]);
    flags: ACC_PUBLIC, ACC_STATIC

    Code:
      stack=3, locals=2, args_size=1
         0: new           #3                  // class com/ant/HelloWorld
         3: dup           
         4: ldc           #4                  // String Tom
         6: invokespecial #5                  // Method "<init>":(Ljava/lang/String;)V
         9: astore_1      
        10: aload_1       
        11: invokevirtual #6                  // Method sayHelloWorld:()V
        14: return        
      LineNumberTable:
        line 13: 0
        line 14: 10
        line 15: 14

  public void sayHelloWorld();
    flags: ACC_PUBLIC

    Code:
      stack=3, locals=1, args_size=1
         0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: new           #8                  // class java/lang/StringBuilder
         6: dup           
         7: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
        10: ldc           #10                 // String Java: 
        12: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        15: aload_0       
        16: getfield      #2                  // Field name:Ljava/lang/String;
        19: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: ldc           #12                 // String  , HelloWorld !
        24: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        27: invokevirtual #13                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        30: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        33: return        
      LineNumberTable:
        line 18: 0
        line 19: 33
}

javap -public com.ant.HelloWorld:

Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
  public com.ant.HelloWorld(java.lang.String);
  public static void main(java.lang.String[]);
  public void sayHelloWorld();
}

javap -p com.ant.HelloWorld:

Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
  private java.lang.String name;
  private static final java.lang.String LANGUAGE;
  public com.ant.HelloWorld(java.lang.String);
  public static void main(java.lang.String[]);
  public void sayHelloWorld();
}

javap -sysinfo com.ant.HelloWorld:

Classfile /D:/com/ant/HelloWorld.class
  Last modified 2016-11-1; size 837 bytes
  MD5 checksum e5ee3b20c3c6196f835eea02b3777e50
  Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
  public com.ant.HelloWorld(java.lang.String);
  public static void main(java.lang.String[]);
  public void sayHelloWorld();
}

javap -c -p com.ant.HelloWorld:

Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
  private java.lang.String name;

  private static final java.lang.String LANGUAGE;

  public com.ant.HelloWorld(java.lang.String);
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: aload_1       
       6: putfield      #2                  // Field name:Ljava/lang/String;
       9: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #3                  // class com/ant/HelloWorld
       3: dup           
       4: ldc           #4                  // String Tom
       6: invokespecial #5                  // Method "<init>":(Ljava/lang/String;)V
       9: astore_1      
      10: aload_1       
      11: invokevirtual #6                  // Method sayHelloWorld:()V
      14: return        

  public void sayHelloWorld();
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: new           #8                  // class java/lang/StringBuilder
       6: dup           
       7: invokespecial #9                  // Method java/lang/StringBuilder."<init>":()V
      10: ldc           #10                 // String Java: 
      12: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      15: aload_0       
      16: getfield      #2                  // Field name:Ljava/lang/String;
      19: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      22: ldc           #12                 // String  , HelloWorld !
      24: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      27: invokevirtual #13                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      30: invokevirtual #14                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      33: return        
}

 

转载于:https://my.oschina.net/u/2914561/blog/778144

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值