自定义Java虚拟机01-搜索class文件

        要想运行Java程序,只有Java虚拟机是不够的,还需要有Java类库;Java虚拟机和Java类库一起构成了Java运行时环境;所以,我们自定义的虚拟机需要依赖于JDK的类库;

       Java程序需要main函数作为入口点;那Java虚拟机如何知道main函数在哪个类呢?Oracle的Java虚拟机实现是通过java命令来指定main函数所在的主类的;

       java命令有以下四种形式:

java [-options] class [args]
java [-options] -jar jarfile [args]

javaw [-options] class [args]
javaw [-options] -jar jarfile [args]

       可以向java命令传递三组参数:选项,主类名(或JAR文件名)和main方法参数;选项由"-"开头;

       通常,第一个非选项参数给出了主类的完全限定名;但,如果提供的是-jar选项,则第一个非选项参数表示JAR的文件名,从这个JAR文件中寻找主类;

       javaw命令和java命令几乎一样,差别在于javaw不显示命令行窗口,因此特别适用于启动GUI(图形用户界面)应用程序;

概述

       即便是最简单的"Hello World"程序,也是无法独自运行的;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

       加载上述HelloWorld类之前,首先要加载它的超类(java.lang.Object);在调用main方法前,因为虚拟机需要向main方法传递参数数组,所以需要加载java.lang.String和java.lang.String[]类;把字符串打压到控制台还需要加载java.lang.System类;

       那么,JVM从哪里加载这些类呢?

类路径

       Java虚拟机规范并没有规定虚拟机应该从哪里寻找类,所以不同虚拟机实现可以采用不同的方法;

       HotSpot虚拟机根据类路径(class path)来搜索类,按照搜索的先后顺序,类路径可以分为以下3个部分:

       1.启动类路径(bootstrap classpath):默认对应jre/lib目录,Java标准库(大部分在rt.jar里)位于该路径;

       2.扩展类路径(extension classpath):默认对应jre/lib/ext目录,使用Java扩展机制的类位于这个路径;

       3.用户类路径(user classpath):我们自己实现的类,以及第三方类库则位于用户路径;

       启动类路径可以通过-Xbootclasspath参数修改;

       用户类路径的默认值就是当前目录,也就是".";可以通过设置CLASSPATH环境变量来修改,但这样做不够灵活,所以不推荐使用,更好的办法就是通过java命令传递-classpath(或简写为-cp)选项;

      -classpath/-cp选项的优先级更高,可以覆盖CLASSPATH环境变量设置;-classpath/-cp选项既可以指定目录,也可以指定JAR文件或者ZIP文件;

java -cp path\to\classes ...
java -cp path\to\lib1.jar ...
java -cp path\to\lib2.zip ...

       还可以同时指定多个目录或文件,用分隔符分开即可;

java -cp path\to\classes;lib\a.jar;lib\b.jar;lib\c.zip ...

       从Java 6开始,还可以使用通配符(*)指定某个目录下的所有JAR文件,格式如下:

java -cp classes;lib\* ...

       我们的Java虚拟机将使用JDK的启动类路径来寻找和加载Java标准库中的类,因此需要某种方式指定jre目录的位置;



      





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值