手写Java虚拟机(一)—— Java命令行工具

这个Java命令行工具是个什么意思呢?

其实就是在cmd里面输入java -version,然后会给你返回结果,这样一个东西

我们接下来就是要实现这样一个的类似功能,用Java实现,也就是,在cmd输入myjava -version,输出一些东西。

当然,这个我不当做重点,只是简单实现,我把重点放在JVM内存结构那几块。

首先我们来分析下,java -version,有哪些动作

一:执行java.exe

二:执行的同时传入-version 这个参数

没错!就是这么简单,那么,怎么证明步骤一呢?

可以通过where命令,

输入java,windows就会根据你的环境变量里的Path参数,去寻找对应的java.exe,你可以试下,把你的windows下这些路径的java.exe都换个名字,再看看输入java会不会是找不到可执行文件。

那么,要实现我们的myjava -version,输入myjava的时候,其实也就是去寻找myjava.exe了

然后,我们看看步骤二,怎么获取-verseion这个参数。

因为我们是用Java开发的这个命令行工具,所以启动这个工具的时候必定要有个入口点,这个入口点就是main()方法,参数我们可以通过main()方法中的args参数去获取。

可能我描述的并不好,没关系,我们先看代码,看过之后你就大概知道了。

这是我的项目结构图

Main.java

package com.ziyu.jvm;

import com.ziyu.jvm.ch01.Args;

/**
 * @ClassName main
 * @Date
 * @Author
 * @Description TODO
 **/
public class Main {

    public static void main(String[] args){

        Args.paseArgs(args);

    }

}

Args.java

package com.ziyu.jvm.ch01;

/**
 * @ClassName Args
 * @Date
 * @Author
 * @Description TODO
 **/
public class Args {

    private static final String ARGS_VERSION = "-version";
    private static final String ARGS_HELP = "-help";
    private static final String ARGS_VERBOSE = "-verbose";
    private static final String ARGS_CP = "-cp";

    public static void paseArgs(String... args) {

        if (args.length == 0) {
            System.out.println("Hello!");
            return;
        }

        if (ARGS_VERSION.equals(args[0])) {
            System.out.println("myjvm version is no version");
        }

    }

}

接着我们把项目maven install打成jar包

然后我们在命令行中运行

java -jar target\my-jvm-1.0-SNAPSHOT.jar -version

 

 如果你运行之后提示的是“XX.jar中没有主清单属性”的话,那么可以在pom中添加如下参数

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这是因为java -jar命令实际上是去jar包中查找 META-INF\MANIFEST.MF文件

并且从“Start-Class”参数中读取启动的方法,之所以会提示“XX.jar中没有主清单属性”,是因为没有“Start-Class”这个参数。

OK,到这其实已经做的差不多了,还差个把启动方式从

java -jar target\my-jvm-1.0-SNAPSHOT.jar

变成输入myjvm。

怎么实现呢?

可以把my-jvm-1.0-SNAPSHOT.jar这个jar包转换成myjvm.exe文件,然后在命令行中运行再带上参数-version就可以了。

具体我就不实现了,因为不做重点,思路就是这样,大家可以自行实现。

如果对文章有什么意见,可以在下方留言。

内容参考自《自己动手写Java虚拟机》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值