首頁 >Java >java教程 >Java中的Javap工具及範例

Java中的Javap工具及範例

PHPz
PHPz轉載
2023-08-28 08:09:061029瀏覽

Java中的Javap工具及範例

javap 工具是檢索特定類別或介面資訊的有用方法。透過其反彙編功能,javap 命令(也稱為 Java 反彙編器)被賦予了為使用者提供全面的內部資訊的作用。從 -c 或 -verbose 這兩個選項中,每個選項都會給出獨特的結果,使用者能夠發現自己處於字節碼和字節碼編排領域。如果不使用任何選項,javap 會執行輸入類別的 public、protected 和 package 欄位和方法。

文法

javap [option] [classname]

不使用選項時

範例

javap class_name

輸出

C:\Users\Aashi>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 {};
}

何時使用選項

以下是每個選項以及如何應用它的說明 -

  • -help 或 --help 或 -? -

這用於列印 javap 命令的幫助訊息。

範例

javap -help

輸出

C:\Users\Aashi>javap -help 
Usage: javap <options> <classes> 
where possible options include: 
-help --help -?      Print this usage message
-version             Version information
-V  -verbose         Print additional information
-1                   Print line number and local variable tables
-public              Show only public classes and members
-protected           Show protected/public classes and members
-package             Show package/protected/public classes and members (default)
-p -private          Show all classes and members
-C                   Disassemble the code
-S                   Print internal type signatures
-sysinfo             Show system info (path, size, date, MD5 hash) of class being processed
-constants           Show final constants
-classpath <path>    Specify where to find user class files
-cp <path>           Specify where to find user class files
-bootclasspath <path> Override location of bootstrap class files
  • -版本

用來列印Java的版本資訊。

範例

javap -version

輸出

C:\Users\Aashi>javap -version
1.8.0_151
  • -v 或 -verbose -

這用於列印附加資訊,例如堆疊大小、局部變數數量和方法參數。

範例

javap -v class_name

輸出

C:\Users\Aashi>javap -v java.lang.Object
Classfile jar:file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/rt.jar! /java/lang/Object.class
Last modified Sep 5, 2017; size 1497 bytes
MD5 checksum 074ebc688a81170b8740f1158648a3c7 
Compiled from "Object.java"
public class java.lang.Object 
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Integer         999999
#2 - String          #16                //@
#3 = String          #38                //nanosecond timeout value out of range
#4 = String          #42               //timeout value is negative
#5 - Utf8            ()I
#6 = Utf8            ()Ljava/lang/Object;
#7 - Utf8            ()Ljava/lang/String;
#8 = Utf8            ()V
#9 - Utf8            (I)Ljava/lang/String;
#10 - Utf8           (J)V
#11 = Utf8           (JI)V
#12 - Utf8           (Ljava/lang/Object;)Z
#13 = Utf8           (Ljava/lang/String;)V
#14 - Utf8           <clinit>
#15 = Utf8           <init>
#16 - Utf8           @
#17 - Utf8           Code
#18 = Utf8           Exceptions
#19 - Utf8           Line Number Table
#20 = Utf8           Signature
#21- Utf8            Source File
#22 = Utf8           StackMapTable
#23 Utf8             Append
#24 Utf8             Clone
#25 = Utf8           Equals
#26 Utf8             finalize
#27 = Utf8           getClass
#28 Utf8             getName
#29 - Utf8           hashCode
#30 = Utf8           java/lang/Class
#31 - Utf8           java/lang/CloneNotSupportedException
#32 = Utf8           java/lang/IllegalArgumentException
#33 - Utf8           Java/lang/Integer
#34 Utf8             java/lang/InterruptedException
  • -l -

這用於列印行號和局部變數表。

範例

javap -l class_name

輸出

C:\Users\Aashi>javap -1 java.lang.Object 
Compiled from "Object.java” 
public class java.lang.Object { 
   public java.lang.Object();
   LineNumberTable:
   line 37: 0

   public final native java.lang.Class<?> getClass();

   public native int hashCode();

   public boolean equals(java.lang.Object);
   LineNumberTable:
   line 149: 0

   protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;

   public java.lang.String toString();
   LineNumberTable:
   line 236: 0

   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;
   LineNumberTable:
   line 447: 0
   line 448: 6 
   line 451: 16 
   line 452: 26 
   line 456: 36 
   line 457: 40 
   line 460: 44
   line 461: 49

   public final void wait() throws java.lang.InterruptedException;
   LineNumberTable:
   line 502:0
   line 503: 5
   protected void finalize() throws java.lang.Throwable;
}
  • -公開

這用於僅列印公共類別和成員。

範例

javap -public class_name

輸出

C:\Users\Aashi>javap -public 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);
   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;
}
  • -受保護

這用於列印受保護/公共類別和成員。

範例

javap -protected class_name

輸出

C:\Users\Aashi>javap -protected 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;
}
  • -套件

這用於列印包/受保護/公共類別和成員(預設)。

範例

javap -package class_name

輸出

C:\Users\Aashi>javap -package 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 {};
}
  • -c

這用於列印反彙編程式碼。

範例

javap -c class_name

輸出

C:\Users\Aashi>javap -c java.lang.Object 
Compiled from "Object.java"
public class java.lang.Object (public java.lang.Object();
Code:
0: return
public final native java.lang.Class<?> getClass();

public native int hashCode();

public boolean equals(java.lang.Object);
Code:
0: aload e
1: aload_1
2: 1f_acmpne   9
5:iconst_1 
6: goto        10
9: iconst_0
10: ireturn

protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;

public java.lang.String toString();
Code:
0: new             #52      //class java/lang/StringBuilder
3: dup
4: invokespecial   #74     //Method java/lang/StringBuilder."<init>": ()V
7: aload_e
8: invokevirtual   #73    // Method getClass: ()Ljava/lang/Class;
11: invokevirtual  #67    // Method java/lang/class.getName:()Ljava/lang/String;
14: invokevirtual  #76   // Method java/lang/StringBuilder.append: (Ljava/lang/String;) Ljava/lang/StringBuilder;
17: 1dc            #2    // String @
19: invokevirtual  #76   // Method java/lang/StringBuilder.append: (Ljava/lang/String;)Ljava/lang/StringBuilder;
22: aload_e
23: invokevirtual  #78   // Method hashCode: ()I
26: invokestatic   #69   // Method java/lang/Integer.toHexString: (I) Ljava/lang/String;
29: invokevirtual  #76   // Method java/lang/StringBuilder.append: (Ljava/lang/String;) Ljava/lang/StringBuilder;
32: invokevirtual  #75   // Method java/lang/StringBuilder.toString: ()Ljava/lang/String;
35: areturn
public final native void notify();
  • -s -

這用於列印內部類型簽名。

範例

javap -s class_name

輸出

C:\Users\Aashi>javap -s java.lang.Object 
Compiled from "Object.java" 
public class java.lang.Object { 
   public java.lang.Object(); 
   descriptor: ()V

   public final native java.lang.Class<?> getClass(); 
   descriptor: ()Ljava/lang/class;

   public native int hashCode();
   descriptor: ()I

   public boolean equals(java.lang.Object);
   descriptor: (Ljava/lang/Object;)Z

   protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException; 
   descriptor:()Ljava/lang/Object;

   public java.lang.String toString();
   descriptor: ()Ljava/lang/String;

   public final native void notify();
   descriptor: ()V

   public final native void notifyAll();
   descriptor: ()V

   public final native void wait(long) throws java.lang.InterruptedException; descriptor: (J)V

   public final void wait(long, int) throws java.lang.InterruptedException; descriptor: (JI)V

   public final void wait() throws java.lang.InterruptedException; 
   descriptor: ()V
   protected void finalize() throws java.lang.Throwable;
   descriptor: ()V
   static {}; 
   descriptor: ()V
}
  • -sysinfo -

#這用於列印正在處理的類別的系統資訊(路徑、大小、日期、MD5 哈希)。

範例

javap -sysinfo class_name

輸出

C:\Users\Aashi>javap -sysinfo java.lang.Object
Classfile jar:file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/rt.jar! /java/lang/Object.class 
Last modified Sep 5, 2017; size 1497 bytes
MD5 checksum 074ebc688a81170b8740f1158648a3c7 
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 -constants class_name

輸出

C:\Users\Aashi>javap -constants 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 編碼人員來說是一個多方面且非常強大的工具,使他們能夠診斷和調試類文檔、評估字段和方法以及從類文檔的字節碼生成清晰的代碼。這個不可或缺的工具適合所有技能水平的 Java 開發人員,使他們能夠輕鬆擴展知識並排除 Java 程式故障。對於任何有抱負的程式設計師來說,javap 工具都是不可替代的財產,它肯定有助於快速提高他們的程式設計能力。此外,其廣泛的功能可以幫助編碼人員完善他們的實踐,為他們在建立 Java 應用程式時提供競爭優勢。

以上是Java中的Javap工具及範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除
上一篇:Java 與 C#下一篇:Java 與 C#