Class Loader
Jave的类加载器并不是说jvm只有一个类加载器,它其实有好多个类加载器。类加载器分为2种:原始类加载器和类加载器对象。
原始类加载器只有一个,它是jvm实现的一部分。它通常从本地磁盘加载可信class文件,包含JAVA API的class文件。
在运行时,java应用程序可以安装类加载器对象,从而可以实现定制化的class文件加载。
JVM默认认为从原始类加载器加载的class文件是可信的,与之相反,JVM默认认为从类加载器对象加载的class文件是不可信的。
原始类加载器是JVM的一部分,类加载器对象却不是。类加载器对象使用java编写,它实际是正在运行的java应用程序的可执行代码的一部分。
类加载器对象的一个重要作用是,您不必在编译时知道最终参与运行的 Java 应用程序的所有类。它们使您能够在运行时动态扩展 Java 应用程序。
当一个已加载的类A第一次引用另一个类B时,虚拟机使用加载过A类的类加载器请求被引用的类B。
因为 Java 虚拟机采用这种方法来加载类,所以类在默认情况下只能看到由同一类加载器加载的其他类。这就是 Java 的体系结构使您能够在单个 Java 应用程序中创建多个名称空间的方式。正在运行的 Java 程序中的每个类加载器都维护自己的名称空间,该名称空间由它已加载的所有类的名称填充。
由不同类加载器加载的类位于不同的命名空间中,除非应用程序明确允许,否则无法相互访问。
个人认为这种机制正好也解释了Java代码中不加访问修饰符的默认修饰符为internal(即包内成员可见)。而类加载器的这种机制正好描述了java中的隔离性,提供了安全性和web扩展性。