命令行中 javac、java、javap 的使用小結(jié)
進入命令窗口,若要切換到指定目錄,例如 E 盤下的目錄,有2種方法:
1)pushd [路徑] ,此命令可將當前目錄設(shè)為指定的任一個已存在的目錄
C:\Users\Administrator>pushd e:360Downloads E:\360Downloads>dir // 顯示當前目錄下的目錄及文件
2) 直接先輸入 e: ,然后再用 cd 切換到指定目錄
1. javac
javac是用來編譯.java文件的。命令行下直接輸入javac可以看到大量提示信息,提示javac命令的用法,常用格式如下:
javac -d destdir srcFile
1、-d destdir:指定存放編譯生成的 .class 文件的路徑。
當前目錄可以用“.”來表示,即:javac -d . srcFile;
若此選項省略,那么默認在當前目錄下生成 .class 文件,并且沒有生成包文件夾;如 javac JavacTest.java ,便在當前路徑下生成了一個JavacTest.class的文件。

JavacTest.java 是一個首行標注了 package 的 java 文件,而此時編譯的字節(jié)碼文件 JavacTest.class 在硬盤上的目錄并未對應(yīng)它的包名,所以,使用 java com.stopTalking.test.JavacTest 運行時是無法找到該java的。會報找不到該文件錯誤。
注意:添加 -d 選項除了可以指定存放編譯生成的 .class 文件的路徑外,最大的區(qū)別是可以將源文件首行的 package 關(guān)鍵字下的包名在當前路徑下生成文件夾。
若輸入,javac –d . JavacTest.java ,那么生成的 JavacTest.class 便在當前目錄下生成的包文件中了:

2、srcFile 是源文件.java文件的路徑。
例如:
E:\JavaWeb_workspaces\apptest\src\com\zxk\test>javac -encoding utf-8 -d . SoftReferenceTest.java
選項 -encoding utf-8 為編譯指定編碼,避免中文亂碼。
2. java
然后執(zhí)行該字節(jié)碼文件,在大部分的教材中,看到直接使用 java JavacTest 便可執(zhí)行,可是我們發(fā)現(xiàn)出現(xiàn)這樣的錯誤:

這是因為,大部分的教材使用的類是默認包名的,即源文件的第一行是沒有 package 指定包名的。使用一個類,我們需要使用它的全限定類名。
所以,在命令行需加上包層次目錄:java com/stopTalking/test/JavacTest,便可看到正確的結(jié)果了。
總結(jié):使用 java 命令運行一個.class文件,需要使用該類的全限定類名,同時需要在當前路徑下有該類的包層次文件夾。這就必須要求編譯時使用 -d 選項,否則需要手動建立包層次文件夾。
3. javap
javap 主要用于幫助開發(fā)者深入了解 Java 編譯器的機制,主要選項有:
-c:分解方法代碼,即顯示每個方法具體的字節(jié)碼
-public | protected | package | private:用于指定顯示哪種級別的類成員
-verbose:指定顯示更進一步的詳細信息
輸入 javap -c com/zxk/test/SoftReferenceTest ,輸出信息顯示如下:
E:\JavaWeb_workspaces\dbBackup\src\com\zxk\test>javap -c com/zxk/test/SoftReferenceTest
Compiled from "SoftReferenceTest.java"
public class com.zxk.test.SoftReferenceTest {
public com.zxk.test.SoftReferenceTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // int 100000
2: anewarray #3 // class java/lang/ref/SoftReference
5: astore_1
6: iconst_0
7: istore_2
8: iload_2
9: aload_1
10: arraylength
11: if_icmpge 59
14: new #4 // class com/zxk/test/Person
17: dup
18: new #5 // class java/lang/StringBuilder
21: dup
22: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
25: ldc #7 // String name
27: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
30: iload_2
31: invokevirtual #9 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
34: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
37: iload_2
38: invokespecial #11 // Method com/zxk/test/Person."<init>":(Ljava/lang/String;I)V
41: astore_3
42: aload_1
43: iload_2
44: new #3 // class java/lang/ref/SoftReference
47: dup
48: aload_3
49: invokespecial #12 // Method java/lang/ref/SoftReference."<init>":(Ljava/lang/Object;)V
52: aastore
53: iinc 2, 1
56: goto 8
59: getstatic #13 // Field java/lang/System.out:Ljava/io/PrintStream;
62: new #5 // class java/lang/StringBuilder
65: dup
66: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
69: ldc #14 // String 回收前:
71: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
74: aload_1
75: iconst_0
76: aaload
77: invokevirtual #15 // Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
80: invokevirtual #16 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
83: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
86: invokevirtual #17 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
89: invokestatic #18 // Method java/lang/System.gc:()V
92: getstatic #13 // Field java/lang/System.out:Ljava/io/PrintStream;
95: new #5 // class java/lang/StringBuilder
98: dup
99: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
102: ldc #19 // String 回收后:
104: invokevirtual #8 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
107: aload_1
108: iconst_0
109: aaload
110: invokevirtual #15 // Method java/lang/ref/SoftReference.get:()Ljava/lang/Object;
113: invokevirtual #16 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
116: invokevirtual #10 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
119: invokevirtual #17 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
122: return
}參考原文:
windows命令行中java和javac、javap使用詳解(java編譯命令)
到此這篇關(guān)于命令行中 javac、java、javap 的使用詳解的文章就介紹到這了,更多相關(guān)javac、java、javap使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot自定義加載yml實現(xiàn)方式,附源碼解讀
這篇文章主要介紹了SpringBoot自定義加載yml實現(xiàn)方式附源碼解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
通過Maven進行jedis連接redis的實現(xiàn)
這篇文章主要介紹了通過Maven進行jedis連接redis的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決
這篇文章主要介紹了java8 對象轉(zhuǎn)Map時重復(fù) key Duplicate key xxxx的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

