在哪些网页元素中可以找到带有class属性的标签?
摘要:本文介绍用户类路径的设置的参数以及不同设置方法的优先级以及从 JVM 源码角度分析了引导类路径是如何设置的,让你对不同的类路径有更深刻的理解。
说明
本文中的 JVM 参数和代码在 JDK 8 版本生效。
哪里有用户类?
用户类是由开发者和第三方定义的类,它是由应用程序类加载器加载的。
Java 程序可以通过CLASSPATH 环境变量,JVM 启动参数 -cp 或者 -classpath 指定用户需要加载的类的路径。这两个配置的优先级从低到高,后面的配置会覆盖前面的配置,默认值是「.」,即当前路径。
接下来对默认值和优先级进行验证:
验证默认值是当前路径
现在有一个 Temp.java 类,它不在任何包路径下:
public class Temp {
public static void main(String[] args) {
System.out.println("Executed!");
}
}
同时这个时候系统没有配置 CLASSPATH 这个环境变量,如下图所示:
然后拷贝这个编译后的 Temp.class 文件放到 E 盘的下,然后执行命令 java Temp 命令,是能够正常运行这个 Class 文件的。这个时候并没有配置 CLASSPATH 环境变量,同时也没有在执行命令时指定任何参数,说明类加载器是根据 class path 的默认值去找到这个 Class 文件的,这个默认值就是当前路径。如下图所示:
根据官方文档所说 Java 程序启动的时候会把 class path 的值放到 java.class.path 这个系统属性中,如下图所示:
修改上面的代码,在程序运行的时候把实际的 class path 打印出来,代码如下:
public class Temp {
public static void main(String[] args) {
System.out.println("Executed!");
System.out.println("The actual class path is :" + System.getProperty("java.class.path"));
}
}
代码执行结果如下图所示:
可以看到代码打印的结果是「.」,即当前路径。
验证 CLASSPATH 环境变量的作用
增加 Windows 系统环境变量,因为上面是把 Temp.class 文件放到了 E 盘下面,所以这里设置的 CLASSPATH 环境变量也是 E 盘,如下图所示:
再次运行程序,执行结果如下图所示:
程序能够正常执行说明通过配置的 E: 这个路径,类加载器能够找到 Temp.class 文件。同时打印的 class path 也是 E: ,符合设置。
验证 -cp 或者 -classpath 参数的作用
把上面设置的 CLASSPATH 环境变量删除,然后通过执行 java 命令的时候指定 -cp 参数来设置 class path 的路径。如下图所示:
程序执行的效果和通过 CLASSPATH 环境变量设置的相同。
验证 -cp或 -classpath 参数的优先级高于 CLASSPATH 环境变量
设置 CLASSPATH 环境变量为 D: ,如下图所示:
如果不带 -cp 参数执行执行会提示找不到类,因为 D: 路径下没有 Temp.class 这个文件。如下图所示:
带上 -cp 参数后就能够正常执行,这个时候两个配置都有,但是 -cp 参数的配置生效了,说明 -cp 参数的优先级高于 CLASSPAHTH 环境变量,如下图所示:
哪里有引导类?
sun.boot.class.path 系统属性的值
引导类指的是构成 Java 平台的类,包括 rt.jar 中的类以及其他几个重要的 jar 文件中的类,它们是由引导类加载器(Bootstrap ClassLoader)加载的。
在前面可以看到如果直接在 Temp.class 文件所在的路径下执行 java Temp命令就能够正常执行。
