zoukankan      html  css  js  c++  java
  • 父类委托机制详解(全盘负责委托机制 )

    父类委托机制详解(全盘负责委托机制 )

        例如:用eclipse的打包工具将TestClassLoader输出成jre/lib/ext目录下的itcast.jar包,再在eclipse中运行这个类,运行结果显示为ExtClassLoadr。此时的环境状态是classpath目录有TestClassLoader.class,ext/itcast.jar包中也有TestClassLoader.class,我们知道,使用一个类,应该只出现一个字节码文件,现在却出现两个了,肿么办?这时候我们就需要了解类加载的具体过程和原理了。如下所示:

    • bootstrap classloader:引导(也称为原始)类加载器,它负责加载Java的核心类。这个加载器是非常特殊的,它实际上不是java.lang.ClassLoader的子类,而是由JVM自身实现的(底层是c代码)。因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库。

    • extension classloader:扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中的JAR包。这为引入除Java核心类以外的新功能提供了一个标准机制。因为默认的扩展目录对所有从同一个JRE中启动的JVM都是通用的,所以放入这个目录的JAR类包对所有的JVM和system classloader都是可见的。

    • system classloader:系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者CLASSPATH操作系统属性所指定的JAR类包和类路径。可以通过静态方法ClassLoader.getSystemClassLoader();找到该类加载器。如果没有特别指定,则用户自定义的任何类加载器都将该类加载器作为它的父加载器。


    • classloader 加载类用的是全盘负责委托机制

    • 全盘负责:即是当一个classloader加载一个Class的时候,这个Class所依赖的和引用的其它Class通常也由这个classloader负责载入。

    • 委托机制:先让parent(父)类加载器 寻找,只有在parent找不到的时候才从自己的类路径中去寻找。

    • 类加载还采用了cache机制:如果cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么修改了Class但是必须重新启动JVM才能生效,并且类只加载一次的原因

  • 相关阅读:
    python脚本
    python引用,浅拷贝,深拷贝
    postgresql MVCC详解
    sql排它锁
    sqlalchemy使用
    ASP.Net MVC开发基础学习笔记(7):数据查询页面
    js timestamp与datetime之间的相互转换
    聊聊iOS中TCP / UDP 协议
    IOS -执行时 (消息传递 )
    Java对象的序列化和反序列化
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/9143939.html
Copyright © 2011-2022 走看看