java javac javap

java

help

java -help

用法: java [-options] class [args...]
           (執(zhí)行類)
   或  java [-options] -jar jarfile [args...]
           (執(zhí)行 jar 文件)
其中選項包括:
    -d32          使用 32 位數(shù)據(jù)模型 (如果可用)
    -d64          使用 64 位數(shù)據(jù)模型 (如果可用)
    -server       選擇 "server" VM
                  默認 VM 是 server.

    -cp <目錄和 zip/jar 文件的類搜索路徑>
    -classpath <目錄和 zip/jar 文件的類搜索路徑>
                  用 ; 分隔的目錄, JAR 檔案
                  和 ZIP 檔案列表, 用于搜索類文件。
    -D<名稱>=<值>
                  設置系統(tǒng)屬性
    -verbose:[class|gc|jni]
                  啟用詳細輸出
    -version      輸出產品版本并退出
    -version:<值>
                  警告: 此功能已過時, 將在
                  未來發(fā)行版中刪除。
                  需要指定的版本才能運行
    -showversion  輸出產品版本并繼續(xù)
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已過時, 將在
                  未來發(fā)行版中刪除。
                  在版本搜索中包括/排除用戶專用 JRE
    -? -help      輸出此幫助消息
    -X            輸出非標準選項的幫助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度啟用斷言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的斷言
    -esa | -enablesystemassertions
                  啟用系統(tǒng)斷言
    -dsa | -disablesystemassertions
                  禁用系統(tǒng)斷言
    -agentlib:<libname>[=<選項>]
                  加載本機代理庫 <libname>, 例如 -agentlib:hprof
                  另請參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<選項>]
                  按完整路徑名加載本機代理庫
    -javaagent:<jarpath>[=<選項>]
                  加載 Java 編程語言代理, 請參閱 java.lang.instrument
    -splash:<imagepath>
                  使用指定的圖像顯示啟動屏幕
有關詳細信息, 請參閱 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

example

-version

java -version

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

run main method

java IntegerTest

當我們使用java命令運行一個.class文件,需要使用該類的全限定類名和在當前路徑下有該類的包層次目錄。這就要求編譯時使用javac -d 參數(shù)。否則需要自己來建立包層次目錄。

javac -encoding UTF-8  -d . IntegerTest.java
java com/james/example/IntegerTest

javac

javac是用來編譯.java文件為.class文件的指令

help

javac -help

用法: javac <options> <source files>
其中, 可能的選項包括:
  -g                         生成所有調試信息
  -g:none                    不生成任何調試信息
  -g:{lines,vars,source}     只生成某些調試信息
  -nowarn                    不生成任何警告
  -verbose                   輸出有關編譯器正在執(zhí)行的操作的消息
  -deprecation               輸出使用已過時的 API 的源位置
  -classpath <路徑>            指定查找用戶類文件和注釋處理程序的位置
  -cp <路徑>                   指定查找用戶類文件和注釋處理程序的位置
  -sourcepath <路徑>           指定查找輸入源文件的位置
  -bootclasspath <路徑>        覆蓋引導類文件的位置
  -extdirs <目錄>              覆蓋所安裝擴展的位置
  -endorseddirs <目錄>         覆蓋簽名的標準路徑的位置
  -proc:{none,only}          控制是否執(zhí)行注釋處理和/或編譯。
  -processor <class1>[,<class2>,<class3>...] 要運行的注釋處理程序的名稱; 繞過默認的搜索進程
  -processorpath <路徑>        指定查找注釋處理程序的位置
  -parameters                生成元數(shù)據(jù)以用于方法參數(shù)的反射
  -d <目錄>                    指定放置生成的類文件的位置
  -s <目錄>                    指定放置生成的源文件的位置
  -h <目錄>                    指定放置生成的本機標頭文件的位置
  -implicit:{none,class}     指定是否為隱式引用文件生成類文件
  -encoding <編碼>             指定源文件使用的字符編碼
  -source <發(fā)行版>              提供與指定發(fā)行版的源兼容性
  -target <發(fā)行版>              生成特定 VM 版本的類文件
  -profile <配置文件>            請確保使用的 API 在指定的配置文件中可用
  -version                   版本信息
  -help                      輸出標準選項的提要
  -A關鍵字[=值]                  傳遞給注釋處理程序的選項
  -X                         輸出非標準選項的提要
  -J<標記>                     直接將 <標記> 傳遞給運行時系統(tǒng)
  -Werror                    出現(xiàn)警告時終止編譯
  @<文件名>                     從文件讀取選項和文件名

example

-encoding

javac -encjavaoding UTF-8 -d . IntegerTest.java

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

java com/james/example/IntegerTest

javap

javap是JDK自帶的反匯編器,查看java編譯器為我們生成的字節(jié)碼。 -c 對代碼進行反匯編

help

javap -help

用法: javap <options> <classes>
其中, 可能的選項包括:
  -help  --help  -?        輸出此用法消息
  -version                 版本信息
  -v  -verbose             輸出附加信息
  -l                       輸出行號和本地變量表
  -public                  僅顯示公共類和成員
  -protected               顯示受保護的/公共類和成員
  -package                 顯示程序包/受保護的/公共類
                           和成員 (默認)
  -p  -private             顯示所有類和成員
  -c                       對代碼進行反匯編
  -s                       輸出內部類型簽名
  -sysinfo                 顯示正在處理的類的
                           系統(tǒng)信息 (路徑, 大小, 日期, MD5 散列)
  -constants               顯示最終常量
  -classpath <path>        指定查找用戶類文件的位置
  -cp <path>               指定查找用戶類文件的位置
  -bootclasspath <path>    覆蓋引導類文件的位置

example

public class MyIntegerTest {
    public static void main(String[] args) {
        int result = test();
        System.out.println(result);
    }
    public static int test() {
        int a = 1;
        int b = 2;
        return a + b;
    }
}

-p

javac -encoding UTF-8 MyIntegerTest.java
javap -p MyIntegerTest

警告: 二進制文件MyIntegerTest包含com.james.example.MyIntegerTest
Compiled from "MyIntegerTest.java"
public class com.james.example.MyIntegerTest {
  public com.james.example.MyIntegerTest();
  public static void main(java.lang.String[]);
}

-c

javac -encoding UTF-8 MyIntegerTest.java
javap -c MyIntegerTest

警告: 二進制文件MyIntegerTest包含com.james.example.MyIntegerTest
Compiled from "MyIntegerTest.java"
public class com.james.example.MyIntegerTest {
  public com.james.example.MyIntegerTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #2                  // Method test:()I
       3: istore_1                          // 將操作數(shù)棧頂?shù)恼麛?shù)值(test()方法的返回值)出棧并存入局部變量表的第一個Slot中
       4: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: iload_1                           // 將局部變量表中的第一個Slot中的整型值復制到操作數(shù)棧頂
       8: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      11: return

  public static int test();
    Code:
       0: iconst_1  // 將常量1壓入操作數(shù)棧
       1: istore_1  // 將操作數(shù)棧頂?shù)恼椭党鰲2⒋娣湃刖植孔兞勘碇械牡谝粋€Slot中
       2: iconst_2  // 將常量2壓入操作數(shù)棧
       3: istore_2  // 將操作數(shù)棧頂?shù)恼椭党鰲2⒋娣湃刖植孔兞勘碇械牡诙€Slot中
       4: iload_1   // 將局部變量表中的第一個Slot中的整型值復制到操作數(shù)棧頂
       5: iload_2   // 將局部變量表中的第二個Slot中的整型值復制到操作數(shù)棧頂
       6: iadd      // 將操作數(shù)棧中頭兩個棧頂元素出棧,做整型的加法,然后將結果重新入操作數(shù)棧
       7: istore_2  // 將操作數(shù)棧頂?shù)恼椭党鰲2⒋娣湃刖植孔兞勘碇械牡谌齻€Slot中
       8: iload_2   // 將局部變量表中的第三個Slot中的整型值復制到操作數(shù)棧頂
       9: ireturn   // 將操作數(shù)棧中的棧頂值返回給此方法的調用者
}

當int取值-1-5采用iconst指令,取值-128-127采用bipush指令,取值-32768-32767采用sipush指令,取值-2147483648~2147483647采用 ldc 指令。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容