绥中做网站公司,帝国cms网站,汕头网站推广公司,购买网站模板怎么用类加载器 JVM的类加载通过classLoader及其子类完成的 类加载器#xff1a; 启动类加载器#xff08;Bootstrap ClassLoader#xff09;#xff1a; 负责加载存放在 JAVA_HOME\lib 目录中的核心类库#xff0c;如rt.jar、resources.jar等#xff08;或者被 -Xboot…类加载器 JVM的类加载通过classLoader及其子类完成的 类加载器 启动类加载器Bootstrap ClassLoader 负责加载存放在 JAVA_HOME\lib 目录中的核心类库如rt.jar、resources.jar等或者被 -Xbootclasspath 参数所指定的路径中的并且是虚拟机识别的类库。这个加载器是 C 编写的随着JVM启动。
扩展类加载器Extension ClassLoader 负责加载JAVA_HOME\lib\ext 目录中的类库同样也可以用 java.ext.dirs 系统变量来指定路径。
应用程序类加载器Application ClassLoader 负责加载用户类路径 classpath 上所有的 jar 包和 .class 文件。
自定义类加载器 可以支持一些个性化的扩展功能比如JRebel
类与类加载器
对于任意一个类都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性每一个类加载器都拥有一个独立的类名称空间。 这句话可以表达得更通俗一些比较两个类是否“相等”只有在这两个类是由同一个类加载器加载的前提下才有意义否则即使这两个类来源于同一个Class文件被同一个虚拟机加载只要加载它们的类加载器不同那这两个类就必定不相等。
这里所指的“相等”包括代表类的Class对象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回结果也包括使用 instanceof 关键字做对象所属关系判定等情况。
类加载器执行顺序 加载时机和过程
类加载的四个时机
执行new、getStatic、putStatic、invokeStaic四条指令时使用java.lang.reflect包办法是对类进行反射调用初始化一个类时发现父类还没初始化要先初始化父类当虚拟机启动时用户需要指定一个主类main需要先将主类加载
一个类的一生 类加载做了什么
类全限定名称 - 二进制字节流加载class文件字节流静态数据 - 方法区永久代、元空间创建字节码Class对象
双亲委派 如果一个类加载器收到了类加载请求它并不会自己先去加载而是把这个请求委托给父类的加载器区执行如果父类加载器还存在其父类加载器则进一步向上委托依次递归请求最终将到达顶层的启动类加载器如果父类加载器可以完成类加载任务就成功返回倘若父加载器无法完成此加载任务子加载器才会尝试自己去加载如果均加载失败就会抛出ClassNotFoundException异常这就是双亲委派模式。 双亲委派优点
安全可避免用户自己编写的类动态替换Java的核心类如java.lang.String。java核心api中定义类型不会被随意替换假设通过网络传递一个名为java.lang.Integer的类通过双亲委托模式传递到启动类加载器而启动类加载器在核心Java API发现这个名字的类发现该类已被加载并不会重新加载网络传递的过来的java.lang.Integer而直接返回已加载过的Integer.class这样便可以防止核心API库被随意篡改。避免全限定命名的类重复加载使用了findLoadClass()判断当前类是否已加载。Java类随着它的类加载器一起具备了一种带有优先级的层次关系通过这种层级关可以避免类的重复加载当父亲已经加载了该类时就没有必要子ClassLoader再加载一次。