这一章节开始JVM的编写,首先解决第一个问题,就是如何运行java程序,回想最开始学java时,写一个Hello.java的程序,使用javac Hello.java将源代码转换为class文件,然后使用java Hello运行程序。JVM是只认class文件的,如果想让JVM运行该Hello程序,就要通过java命令。本节将介绍java命令的常用方法,并实现java命令的解析。最终通过命令参数,读取对应的class数据。

java 命令简介

Java应用程序需要一个入口点,这个入口点就是我们熟知的main()方法。如果一个类包含public static void main(String[] args)方法,这个类就可以用来启动Java应用程序,我们把这个类叫作主类.这个类是需要我们用命令行手动向JVM提供的;

Java命令一般有以下几种形式:

  1. java [-options] class [args]
  2. java [-options] -jar jarfile [args]
  3. javaw [-options] class [args]
  4. javaw [-options] -jar jarfile [args]
  • 可以向 java 命令传递三组参数:选项、主类名(或者JAR文件名)和 main() 方法参数。
  • 选项由减号-开头。通常,第一个非选项参数给出主类的完全限定名(fully qualified class name)。
  • 但是如果用户提供了–jar选项,第一个非选项参数表示JAR文件名,java命令必须从这个JAR文件中寻找主类。javaw命令和java命令几乎一样,唯一的差别在于,javaw命令不显示命令行窗口,因此特别适合用于启动GUI(图形用户界面)应用程序。

可以看到命令中都带有一个[-options]代表可选项, java命令行常用选项如下:

选项 用途
-version 输出版本信息
-?/-help 输出帮助信息
-cp/-classpath 指定用户类路径
-Dproperty=value 设置Java系统属性
-Xms 设置初始堆空间大小
-Xmx 设置最大堆空间大小
-Xss 设置线程栈空间大小

当然,java命令行里提供的选项有很多,这里并不打算全部实现,只是挑几个比较重要的去实现.

接下来我打算实现以下几种命令:

  • java -version
  • java -help
  • java -cp your/classpath yourClassName arg1 arg2 ...

    命令行解析功能编码

    自己动手写相关的参数匹配解析 会导致代码不够优雅,而且不灵活,这里我直接使用了 commons-cli 工具来完成命令行解析的功能。
    需要在pom 文件里面添加如下依赖
    1. <dependency>
    2. <groupId>commons-cli</groupId>
    3. <artifactId>commons-cli</artifactId>
    4. <version>1.2</version>
    5. </dependency>
    核心解析类 见 Main.java
    该类也是 我们的 jvm 的启动类。目前 该方法尚且不完善。需要 使用以下命令才能 读取到 class 文件
    1. -cp jvmx/target/classes/ com.wangzhen.jvm.app
    其实就是告诉我们的 程序我们的class 对象在什么地方。