命令查看java的class字节码文件、verbose、synchronize、javac、javap
生活随笔
收集整理的這篇文章主要介紹了
命令查看java的class字节码文件、verbose、synchronize、javac、javap
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
查看Java字節(jié)碼?
1 javac –verbose查看運(yùn)行類是加載了那些jar文件
HelloWorld演示:
public class Test {public static void main(String[] args) {Object lock = new Object();synchronized (lock) {System.out.println("hello world.");}}}javac –verbose HelloWorld.java
D:\shiva\omcs\Test\src\sync>javac -verbose Test.java [解析開始時間 RegularFileObject[Test.java]] [解析已完成, 用時 68 毫秒] [源文件的搜索路徑: .,C:\Java\jdk1.8.0_31\lib,C:\Java\jdk1.8.0_31\lib\tools.jar] [類文件的搜索路徑: C:\Java\jdk1.8.0_31\jre\lib\resources.jar,C:\Java\jdk1.8.0_31\jre\lib\rt.jar,C:\Java\jdk1.8.0_31\jre lib\sunrsasign.jar,C:\Java\jdk1.8.0_31\jre\lib\jsse.jar,C:\Java\jdk1.8.0_31\jre\lib\jce.jar,C:\Java\jdk1.8.0_31\jre\lib charsets.jar,C:\Java\jdk1.8.0_31\jre\lib\jfr.jar,C:\Java\jdk1.8.0_31\jre\classes,C:\Java\jdk1.8.0_31\jre\lib\ext\access bridge-64.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\cldrdata.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\dnsns.jar,C:\Java\jdk1.8.0_3 \jre\lib\ext\jaccess.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\jfxrt.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\localedata.jar,C:\Ja a\jdk1.8.0_31\jre\lib\ext\nashorn.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\sunec.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\sunjce_ rovider.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\sunmscapi.jar,C:\Java\jdk1.8.0_31\jre\lib\ext\sunpkcs11.jar,C:\Java\jdk1.8. _31\jre\lib\ext\zipfs.jar,.,C:\Java\jdk1.8.0_31\lib,C:\Java\jdk1.8.0_31\lib\tools.jar] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]] [正在檢查sync.Test] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Byte.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Character.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Short.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Long.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Float.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Integer.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Double.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Boolean.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Void.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/System.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/PrintStream.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/OutputStream.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Appendable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Closeable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/io/Flushable.class)]] [正在加載ZipFileIndexFileObject[C:\Java\jdk1.8.0_31\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Throwable.class)]] [已寫入RegularFileObject[Test.class]] [共 620 毫秒]D:\shiva\omcs\Test\src\sync>可以看到虛擬機(jī)編譯時做了那些事情……
java -verbose Test
可以看到虛擬機(jī)運(yùn)行一個程序時加載的jar包
更多內(nèi)容查看javac –help命令
2 ?javap查看字節(jié)碼
首先使用javap –help可以查看到各種命令,各個命令什么作用,可以自己運(yùn)行試試……
這里只是測試 javap –c和javap –verbose
javap –c HelloWorld
D:\shiva\omcs\Test\bin\sync>javap -c Test 警告: 二進(jìn)制文件Test包含sync.Test Compiled from "Test.java" public class sync.Test {public sync.Test();Code:0: aload_01: invokespecial #8 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #3 // class java/lang/Object3: dup4: invokespecial #8 // Method java/lang/Object."<init>":()V7: astore_18: aload_19: dup10: astore_211: monitorenter12: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;15: ldc #22 // String hello world.17: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V20: aload_221: monitorexit22: goto 2825: aload_226: monitorexit27: athrow28: returnException table:from to target type12 22 25 any25 27 25 any }D:\shiva\omcs\Test\bin\sync>cd ..可以查看字節(jié)碼,從中可以得到各種變量的信息等等
但是javap –verbose可以看到更加清楚的信息。如下圖
D:\shiva\omcs\Test\bin\sync>javap -verbose Test 警告: 二進(jìn)制文件Test包含sync.Test Classfile /D:/shiva/omcs/Test/bin/sync/Test.classLast modified 2016-11-15; size 686 bytesMD5 checksum 954bd4bcfcff2732e5be9925e518e79aCompiled from "Test.java" public class sync.Testminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER Constant pool:#1 = Class #2 // sync/Test#2 = Utf8 sync/Test#3 = Class #4 // java/lang/Object#4 = Utf8 java/lang/Object#5 = Utf8 <init>#6 = Utf8 ()V#7 = Utf8 Code#8 = Methodref #3.#9 // java/lang/Object."<init>":()V#9 = NameAndType #5:#6 // "<init>":()V#10 = Utf8 LineNumberTable#11 = Utf8 LocalVariableTable#12 = Utf8 this#13 = Utf8 Lsync/Test;#14 = Utf8 main#15 = Utf8 ([Ljava/lang/String;)V#16 = Fieldref #17.#19 // java/lang/System.out:Ljava/io/PrintStream;#17 = Class #18 // java/lang/System#18 = Utf8 java/lang/System#19 = NameAndType #20:#21 // out:Ljava/io/PrintStream;#20 = Utf8 out#21 = Utf8 Ljava/io/PrintStream;#22 = String #23 // hello world.#23 = Utf8 hello world.#24 = Methodref #25.#27 // java/io/PrintStream.println:(Ljava/lang/String;)V#25 = Class #26 // java/io/PrintStream#26 = Utf8 java/io/PrintStream#27 = NameAndType #28:#29 // println:(Ljava/lang/String;)V#28 = Utf8 println#29 = Utf8 (Ljava/lang/String;)V#30 = Utf8 args#31 = Utf8 [Ljava/lang/String;#32 = Utf8 lock#33 = Utf8 Ljava/lang/Object;#34 = Utf8 StackMapTable#35 = Class #31 // "[Ljava/lang/String;"#36 = Class #37 // java/lang/Throwable#37 = Utf8 java/lang/Throwable#38 = Utf8 SourceFile#39 = Utf8 Test.java {public sync.Test();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #8 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 24: 0LocalVariableTable:Start Length Slot Name Signature0 5 0 this Lsync/Test;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=3, args_size=10: new #3 // class java/lang/Object3: dup4: invokespecial #8 // Method java/lang/Object."<init>":()V7: astore_18: aload_19: dup10: astore_211: monitorenter12: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;15: ldc #22 // String hello world.17: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V20: aload_221: monitorexit22: goto 2825: aload_226: monitorexit27: athrow28: returnException table:from to target type12 22 25 any25 27 25 anyLineNumberTable:line 28: 0line 29: 8line 30: 12line 29: 20line 33: 28LocalVariableTable:Start Length Slot Name Signature0 29 0 args [Ljava/lang/String;8 21 1 lock Ljava/lang/Object;StackMapTable: number_of_entries = 2frame_type = 255 /* full_frame */offset_delta = 25locals = [ class "[Ljava/lang/String;", class java/lang/Object, class java/lang/Object ]stack = [ class java/lang/Throwable ]frame_type = 250 /* chop */offset_delta = 2 } SourceFile: "Test.java" D:\shiva\omcs\Test\bin\sync>以上為命令查看java字節(jié)碼文件過程,對了解java背后的秘密,深層次理解java有用
總結(jié)
以上是生活随笔為你收集整理的命令查看java的class字节码文件、verbose、synchronize、javac、javap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android最佳的开源库(四)
- 下一篇: Android7.1图标快捷方式(App