• JVM随笔(二)之搜索类


    上章我们知道JVM可以通过参数的方式指定main方法所在的主类,但是即使最简单的"HelloWorld"程序,也是无法自行运行的,HelloWorld程序如下:

    ```java public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World"); } } ```

    在加载HelloWorld之前,首先JVM还需要加载它的超类,也就是java.lang.Object。在调用main方法之前,还需要加载其参数也就是,java.lang.String和java.lang.String[]。执行main方法中的打印方法,还需要加载java.lang.System类,等等。那么JVM将从哪里去加载这些类呢?

    java虚拟机规范中没有规定虚拟机从哪里加载类,因此不同的虚拟机可以采用不同的方式加载。Oracle的Java虚拟机的实现是根据类路径来进行搜索。按照搜索的先后顺序,类路径可以分为如下三个部分。

    • 启动类路径(bootstrap classpath)

      启动类路径默认对应jre/lib目录,java的标准库(大部分在rt.jar中)位于该路径下。

    • 扩展类路径(extension classpath)

      扩展类路径默认对应jre/lib/ext,使用Java扩展机制的类位于该路径下,比如 swing的一些类都是Java扩展。

    • 用户类路径(user classpath)

      我们自己应用中的类,以及第三方的类库位于用户类路径。

    我们可以使用-Xbootclasspath选项可以对启动类路径进行修改,但是通常不需要需改启动类路径。可以使用-Djava.ext.dirs=directories-extdirs directories修改扩展类路径。

    用户类路径默认是当前目录,也就是`.`。可以通过设置CLASSPATH环境变量来进行修改用户类路径,但是这样不够灵活,所以一般不推荐使用。更好的办法是通过java命令传递一个`-classpath`或`-cp`选项进行指定。参数的优先级高于CLASSPATH环境变量。

    其中`-classpath`或`-cp`选项既能指定目录,也可以指定jar文件或者zip文件,如下


    java -cp /path/classes :/path/classes2 ...
    java -cp /path/lib.jar:/path/lib1.jar ...
    java -cp /path/lib.zip:/path/lib1.zip


    其中可以多个混合使用,分割符在Windows下使用;在Linux下使用:,在java6后还可以使用通配符*去进行模糊匹配

  • 相关阅读:
    浅析Java中的final关键字
    浅谈JAVA集合框架
    While reading XXX pngcrush caught libpng error: N
    git/svn里面的merge和rebase区别
    kvc kvo 总结---180313
    iOS 拨打电话三种方式总结
    IOS中获取各种文件的目录路径的方法-备
    文件管理系统-备
    iOS界面调试工具 Reveal-备用
    十六进制string转换UIColor -备用
  • 原文地址:https://www.cnblogs.com/wuqinghua-blog/p/10994904.html
Copyright © 2020-2023  润新知