理解javap工具

javap命令用于反汇编类文件。javap命令显示类文件中的字段、构造函数和方法的信息。

使用javap工具的语法

让我们看看如何使用javap工具或命令。

javap fully_class_name  

使用javap工具的示例

javap java.lang.Object  

输出:

Compiled from "Object.java"
public class java.lang.Object {
  public java.lang.Object();
  public final native java.lang.Class<?> getClass();
  public native int hashCode();
  public boolean equals(java.lang.Object);
  protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
  public java.lang.String toString();
  public final native void notify();
  public final native void notifyAll();
  public final native void wait(long) throws java.lang.InterruptedException;
  public final void wait(long, int) throws java.lang.InterruptedException;
  public final void wait() throws java.lang.InterruptedException;
  protected void finalize() throws java.lang.Throwable;
  static {};
}

使用javap工具的另一个示例

让我们为我们的Java文件使用javap命令。

文件名:Simple.java

class Simple{  
public static void main(String args[]){  
System.out.println("hello java");  
}  
}  

现在让我们使用javap工具来反汇编类文件。

javap Simple  

输出:

Compiled from "Simple.java"  
class Simple {  
  Simple();  
  public static void main(java.lang.String[]);  
}  

javap -c命令

您可以使用javap -c命令查看反汇编的代码。该代码反映了Java字节码。

javap -c Simple  

输出:

Compiled from "Simple.java"  
class Simple {  
  Simple();  
    Code:  
       0: aload_0         
       1: invokespecial #1                  // Method java/lang/Object."":()V  
       4: return          
  
  public static void main(java.lang.String[]);  
    Code:  
       0: getstatic     #2                 // Field java/lang/System.out:Ljava/io/PrintStream;  
       3: ldc           #3                  // String hello java  
       5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V  
       8: return          
}  

javap工具的选项

javap工具的重要选项如下。

OptionDescription
-help打印帮助信息。
-l打印行号和局部变量
-c反汇编代码
-s打印内部类型签名
-sysinfo显示系统信息(路径、大小、日期、MD5 哈希)
-constants显示静态最终常量
-version显示版本信息

让我们通过一个示例来看如何使用这些选项。对于以下文件(ABC.java),我们将使用上述选项。

文件名:ABC.java

public class ABC  
{  
// main method  
public static void main(String argvs[])  
{  
// declaring an integer array  
int arr[] = {6, 7, 8, 6, 8, 0, 4};  
  
// caculating size of the array  
int size = arr.length;  
  
// printing size of the array  
System.out.println("The size of the array is " + size );  
  
System.out.println("The 8th index of the array is " + arr[8] );  
  
}  
}  

命令:javap -c ABC

输出:

Compiled from "ABC.java"
public class ABC {
  public ABC();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: bipush        7
       2: newarray       int
       4: dup
       5: iconst_0
       6: bipush        6
       8: iastore
       9: dup
      10: iconst_1
      11: bipush        7
      13: iastore
      14: dup
      15: iconst_2
      16: bipush        8
      18: iastore
      19: dup
      20: iconst_3
      21: bipush        6
      23: iastore
      24: dup
      25: iconst_4
      26: bipush        8
      28: iastore
      29: dup
      30: iconst_5
      31: iconst_0
      32: iastore
      33: dup
      34: bipush        6
      36: iconst_4
      37: iastore
      38: astore_1
      39: aload_1
      40: arraylength
      41: istore_2
      42: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      45: iload_2
      46: invokedynamic #13,  0             // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
      51: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      54: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
      57: aload_1
      58: bipush        8
      60: iaload
      61: invokedynamic #23,  0             // InvokeDynamic #1:makeConcatWithConstants:(I)Ljava/lang/String;
      66: invokevirtual #17                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      69: return
}

命令:javap -l ABC

输出:

Compiled from "ABC.java"
public class ABC {
  public ABC();
    LineNumberTable:
      line 1: 0

  public static void main(java.lang.String[]);
    LineNumberTable:
      line 6: 0
      line 9: 39
      line 12: 42
      line 14: 54
      line 16: 69
}

命令:javap -s ABC

输出:

Compiled from "ABC.java"
public class ABC {
  public ABC();
    descriptor: ()V

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
}

命令:javap -sysinfo ABC

输出:

Classfile /C:/Users/Nikhil Kumar/Documents/ABC.class
  Last modified Sep 11, 2021; size 970 bytes
  SHA-256 checksum 576adf03386399a4691e0ce5b6c5aa5d964b082a1a61299bac5632942e413312
  Compiled from "ABC.java"
public class ABC {
  public ABC();
  public static void main(java.lang.String[]);
}

命令:javap -constants ABC

输出:

Compiled from "ABC.java"
public class ABC {
  public ABC();
  public static void main(java.lang.String[]);
}

命令:javap -version ABC

输出:

14
Compiled from "ABC.java"
public class ABC {
  public ABC();
  public static void main(java.lang.String[]);
}

标签: java, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想