`
gogole_09
  • 浏览: 206068 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java类加载器体系结构(待续)

阅读更多
  •    JVM主要有以下的几大类加载器:

             |------Bootstrap  启动加载器

                +--- 主要负责加载 jdk/lib目录下的核心api 或者 -Xbootclasspath选项指定的jar包

             |------Extension  扩展加载器

                +--- 主要负责加载 jdk/lib/ext目录下的核心api 或者 -Djava.ext.dirs 指定目录下jar包

             |------System      系统加载器

                +--- 主要负责加载 java -classpath/-Djava.class.path所指定目录下的类

             |------Custom ClassLoader 自定义类加载器 {java.lang.ClassLoader的子类}

                +--- 程序运行期间,通过其动态加载class .

 

  • 类加载器的特性:

                |------每个Classloader都维护一份自己的名称空间,同一个空间中,不能出现两个同名的类。

                |------Java类加载器采用“双亲委托的加载机制”

 

  下面,我们来看一个自定义类加载器的处理流程:

  

 以下代码,演示除了bootstarp加载器外的类加载器加载流程:

   

// 检查类是否已被装载过
Class c = findLoadedClass(name);
if (c == null ) {
     // 指定类未被装载过
     try {
         if (parent != null ) {
             // 如果父类加载器不为空, 则委派给父类加载
             c = parent.loadClass(name, false );
         } else {
             // 如果父类加载器为空, 则委派给启动类加载加载
             c = findBootstrapClass0(name);
         }
     } catch (ClassNotFoundException e) {
         // 启动类加载器或父类加载器抛出异常后, 当前类加载器将其
         // 捕获, 并通过findClass方法, 由自身加载
         c = findClass(name);
     }
}

 

        

利用Class.forName来加载类,Class.forName使用的是被调用者的类加载器来加载类的.

    这种特性,证明了java类加载器中的名称是唯一的,不会互相干扰,既在一般环境中,保证同一类与之关联的其他类都是通过当前类的类加载器所加载的。

 

public static Class forName(String className)
     throws ClassNotFoundException {
     return forName0(className, true , ClassLoader.getCallerClassLoader());
//getCallerClassLoader() 就是得到调用当前forName方法的类的类加载器
}

/** Called after security checks have been made. */
private static native Class forName0(String name, boolean initialize,
ClassLoader loader)
     throws ClassNotFoundException;

 

 线程上下文类加载器:

      Java默认的线程上下文类加载器是 系统类加载器(AppClassLoader)

   

// Now create the class loader to use to launch the application
try {
    loader = AppClassLoader.getAppClassLoader(extcl);
} catch (IOException e) {
    throw new InternalError(
"Could not create application class loader" );
}

// Also set the context class loader for the primordial thread.
Thread.currentThread().setContextClassLoader(loader);

 

 

     在sun.misc.Launch的无参构造函数Launch()中定义了上述代码。

     使用线程上下文加载器,可以在执行线程中,抛弃双亲委托加载链模式,使用线程上下文里的类加载器加载类。

      如: 在线程上下文中加载第三方的JNDI实现,而不依赖于双亲委托。

 

 自定义类加载器:

    

  • 大小: 96.4 KB
分享到:
评论

相关推荐

    Java收集的代码段1(待续)常用代码段

    在Java编程中,窗口风格、窗口居中、组件拖动、文件路径处理和设置...对于"Java收集的代码段1(待续)常用代码段"这个主题,后续可能还会涉及到更多高级特性和实践技巧,持续学习和实践是提升Java GUI编程能力的关键。

    java100道选择题含答案

    Java 类可以作为类型定义机制,用于定义对象的结构和行为,也可以作为数据封装机制,用于隐藏实现细节。 5. 在创建对象时必须?(C)答案:先声明对象,为对象分配内存空间,对对象初始化,然后才能使用对象 在 ...

    java基础知识测试题

    **题目:** 下列关于 Java 类加载顺序的说法正确的是? - A. 类加载顺序取决于源文件中的第一行 - B. import 语句总是在类定义之前 - C. 类加载顺序只与源文件的同包有关 - D. 类加载顺序与源文件的顺序无关 **...

    自考Java语言程序设计一填空题汇总.pdf

    2. 编写Java程序,可以使用文字编辑器来编写源文件。 3. 把编写好的Java源文件保存起来,原文件的扩展名必须是.java。 4. 用JDK编译Java源程序,使用的命令是javac,编译源文件得到字节码文件。 5. Java源程序编译后...

    JAVA面试冲刺—通过代码深入理解JVM—(未完待续)

    深入理解JVM一、什么是JVM二、JAVA的运行机制三、JVM架构图四、类加载器子系统1、类加载器子系统作用2、加载(Loading)3、链接(Linking)3.1 验证 (Verify)3.2 准备(Prepare)3.3 解析(Resolve)3、初始化4、...

    java程序员面试之150++(待续)

    在Java程序员面试中,面试官通常会关注求职者对Java基础知识的掌握程度,包括但不限于类的作用域、匿名内部类、内部类的类型、位运算符与逻辑运算符的区别、集合框架的理解、断言的使用、字符串对象的创建、数学方法...

    java后端初级面试题

    他们的加载时机是随着类的加载而加载进入方法区,内存只中分配一块区域供所有类使用,可以节省空间。 九、Final、finally、finalize 三者区别 final 是一个修饰符:当 final 修饰一个变量的时候,变量变成一个常量...

    毕业就业-刷题库Java面试题大全(2021年-2022年).rar

    a面试大全2021是一套最新Java面试必问合集,这本面试手册包含了Java基础、Java集合、JVM、Spring、Spring Boot、Spring Cloud、Mysql、Redis、RabbitMQ、Dubbo、Netty、分布式及架构设计等方面的技术点。内容难度...

    JAVA期末考试试题及答案.doc

    * 题目 3:Java 语言的类间的继承关系是?(B) * 解释:这道题考查了JAVA中的继承关系。JAVA中的继承关系是单重的,即一个子类只能继承一个父类。 * 题目 4:设有定义 int i = 6 ;,则执行以下语句后,i 的值为?...

    (完整版)Java编程基础知识点汇总习题集--答案.doc

    1. Java 三大体系:Java SE(J2SE)、Java EE(J2EE)、Java ME(J2ME) * Java SE:标准版,包含 Java 最核心的类库 * Java EE:企业版,开发、装配、部署企业级应用 * Java ME:微型版,用于小型电子设备上的...

    java面试题集锦 java基础、集合、多线程等

    Java 面试题集锦 Java 基础知识点: 1. JDK 和 JRE 的区别: JDK(Java Development Kit)是 Java 开发工具包,提供了 Java 的开发环境和运行环境。JRE(Java Runtime Environment)是 Java 运行环境,为 Java 的...

    Android集成主流优秀第三方组件框架

    LOG相关工具类(ToolLog.java) 功能待续-->切入记录异常日志,并存储文件或上传至服务 器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/...

    java精典编程100例 33

    java 精典编程 100 例, author:朱千平 phone:13522080786 qq:200896066待续......

    JDBC待续

    1. **JDBC API**:首先,会介绍 JDBC 的核心类和接口,如 `java.sql.DriverManager`、`Connection`、`Statement`、`PreparedStatement` 和 `ResultSet`。这些类和接口是使用 JDBC 访问数据库的基础。 2. **数据库...

    Java 开发工程师(初级)招聘试题

    本题未给出完整的代码示例,但从题目描述来看,主要考察考生对 Java 集合类的使用能力。通常情况下,可以使用 `ArrayList` 或 `LinkedList` 等集合类来存储 `Data` 类型的对象,并对其进行添加、删除、查找等操作。 ...

    扬声器力学分布式参数(第一部分:测量篇)(待续).pdf

    本文件《扬声器力学分布式参数(第一部分:测量篇)(待续)》提供了一种测量扬声器力学参数的方法,并详细介绍了如何通过这些参数来提升扬声器的设计和诊断能力。 首先,扬声器单元的力学振动特性可以通过一组线性的...

    java精典编程100例 43

    java 精典编程 100 例,待续...... author:朱千平 phone:13522080786 qq:200896066

    java精典编程100例 6

    java 精典编程 100 例,待续...... author:朱千平 phone:13522080786 qq:200896066

    java精典编程100例 26

    java 精典编程 100 例,待续...... author:朱千平 phone:13522080786 qq:200896066

Global site tag (gtag.js) - Google Analytics