java javac javap

java javac javap

java

help

java -help

用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -server       选择 "server" VM
                  默认 VM 是 server.

    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 ; 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -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 参数。否则需要自己来建立包层次目录。

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                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -parameters                生成元数据以用于方法参数的反射
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -h <目录>                    指定放置生成的本机标头文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -profile <配置文件>            请确保使用的 API 在指定的配置文件中可用
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=值]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名

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编译器为我们生成的字节码。 -c 对代码进行反汇编

help

javap -help

用法: javap <options> <classes>
其中, 可能的选项包括:
  -help  --help  -?        输出此用法消息
  -version                 版本信息
  -v  -verbose             输出附加信息
  -l                       输出行号和本地变量表
  -public                  仅显示公共类和成员
  -protected               显示受保护的/公共类和成员
  -package                 显示程序包/受保护的/公共类
                           和成员 (默认)
  -p  -private             显示所有类和成员
  -c                       对代码进行反汇编
  -s                       输出内部类型签名
  -sysinfo                 显示正在处理的类的
                           系统信息 (路径, 大小, 日期, MD5 散列)
  -constants               显示最终常量
  -classpath <path>        指定查找用户类文件的位置
  -cp <path>               指定查找用户类文件的位置
  -bootclasspath <path>    覆盖引导类文件的位置

example

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

-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                          // 将操作数栈顶的整数值(test()方法的返回值)出栈并存入局部变量表的第一个Slot中
       4: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: iload_1                           // 将局部变量表中的第一个Slot中的整型值复制到操作数栈顶
       8: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      11: return

  public static int test();
    Code:
       0: iconst_1  // 将常量1压入操作数栈
       1: istore_1  // 将操作数栈顶的整型值出栈并存放入局部变量表中的第一个Slot中
       2: iconst_2  // 将常量2压入操作数栈
       3: istore_2  // 将操作数栈顶的整型值出栈并存放入局部变量表中的第二个Slot中
       4: iload_1   // 将局部变量表中的第一个Slot中的整型值复制到操作数栈顶
       5: iload_2   // 将局部变量表中的第二个Slot中的整型值复制到操作数栈顶
       6: iadd      // 将操作数栈中头两个栈顶元素出栈,做整型的加法,然后将结果重新入操作数栈
       7: istore_2  // 将操作数栈顶的整型值出栈并存放入局部变量表中的第三个Slot中
       8: iload_2   // 将局部变量表中的第三个Slot中的整型值复制到操作数栈顶
       9: ireturn   // 将操作数栈中的栈顶值返回给此方法的调用者
}

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

上一篇:Java CoreI 000001


下一篇:Java/JDK 的下载安装教程