最后,类的加载还受 Class Loader 和 安全策略(Security Policies)的影响。在 Java 中,我们���以使用不同的 Class Loader,也可以编写自己的 Class Loader,但是大部分时候,我们都是使用的内置的 Class Loader。在 Java 中可以启用不同的安全策略,我们信任的类就允许它加载,不信任的就不允许。如果没有开启安全策略,则所有的类都认为是被信任的。但是即使开启了安全策略,也只会影响到 Extension classes 和 User classes,对 Bootstrap classes 是没有影响的。
CLASSPATH和Package的关系在 Java 中还有一个让人头疼的地方,就是 .class 文件的存放位置和 package 之间的关系。在 Java 语言中,为了不发生命名冲突,特意引入了 package 机制,将 Java 中的类划分到不同的 package 之中。在前面我展示的 HelloWorld.java 中,我将它的 package 设置为 com.xkland.java_8_study,然后编译这个程序的时候,我特意使用了 javac -d . 选项,设置将当前目录 . 作为编译后的目标位置。编译完成后,我还特意使用 tree 命令查看了一下目录的结构。
从结果中可以看出,HelloWorld.class 存放的位置为 ./com/xkland/java_8_study/HelloWorld.class。这个目录层次和 package 的命名是完全一致的。而且必须一致,否则将会找不到 .class 文件,也无法运行程序。所以,如果你的 package 的命名是 a.b.c.d 这样的,则只能组织成 a/b/c/d/xx.class 这样的目录树,并且从 a 目录的上一级目录开始搜索这个 class 才找得到,也就是说,必须将 a 目录的上一级目录加入 CLASSPATH。对于源代码没有这个限制,但是使用同样的方式组织源代码是一个好的做法。如果源代码目录是扁平的,就像我前面的例子一样,则调用 javac 的时候一定要指定 -d 参数,它会自动生成 .class 文件的目录结构。
总结没什么好总结的。就是看了 Oracle Java SE 8 官方文档后的一点记录。 How classes are found? 还是值得偶尔复习一下的。
Ubuntu 14.04安装JDK1.8.0_25与配置环境变量
CentOS 搭建JDK环境
Ubuntu 14.04安装JDK1.8.0_25与配置环境变量