`
sean2012
  • 浏览: 44532 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Class加载机制——加载器类型

阅读更多
Class加载机制——加载器类型


        在JVM中有三种类型的Class加载器,如图所示:



引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用C++实现的,我们无法访问到。

扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。是用Java来实现的。

系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()来获取它。


一、三个加载器工作流程
1、一个Class加载,先从引导类加载器开始,如果引导类加载器不能加载则交给扩展加载器;
2、如果扩展类加载器不能加载再交给系统类加载器(也称为应用类加载器);
3、直到加载成功。


二、加载器的特点
1、可以决定一个Class的加载过程;

2、相同全名称的两个类,可以通过使用不同加载器来共存在内存中;

3、引导类加载器很好的保护了Java核心类不受干扰;



三、获取Class的加载器
实例:
package com.sean.jvm;

public class Test01 {
	public static void main(String[] args) {
		try {
			Class clas1 = Class.forName("java.lang.String");
			Class clas2 = Class.forName("com.sean.jvm.Test01");
			System.out.println("clas1-->" + clas1.getClassLoader()+"就是");
			System.out.println("clas2-->" + clas2.getClassLoader());
			System.out.println("clas2的父级加载-->"+ clas2.getClassLoader().getParent());
			System.out.println("clas2的父级的父级加载-->"+ clas2.getClassLoader().getParent().getParent());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}


输出结果:
clas1-->null
clas2-->sun.misc.Launcher$AppClassLoader@281d4b
clas2的父级加载-->sun.misc.Launcher$ExtClassLoader@19b5217
clas2的父级的父级加载-->null




我们可以根据java.lang.Class<T>类中的getClassLoader() API文档可知,当返回的是Null时,表示采用了引导类加载器。

四、ClassLoader的应用
1、可以决定自己的Class的加载过程
2、可以给Class加密,防止反编译






  • 大小: 42.7 KB
  • 大小: 24.1 KB
分享到:
评论

相关推荐

    JVM学习笔记(一)——类的加载机制

    ​ 类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动...

    【JVM】类加载器与双亲委派模型

    有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘 类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类...

    JVM解毒——类加载子系统

    带着问题,尤其是面试问题的学习才是最高效的。...Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制

    Visual C++实践与提高-COM和COM+篇『PDF』

    13.5 利用共享属性管理器共享状态——例程Steps 13.5.1 共享属性管理器 13.5.2 修改Step4程序 13.5.3 测试组件 13.6 使用多事务处理——例程Step6 13.6.1 修改Step5程序 13.6.2 测试组件 13.7 使用基于角色的安全性...

    Java典型模块

    3.3.1 反射的基石——Class类 3.3.2 反射的基本应用 3.3.3 反射的高级应用 3.4 标注 3.4.1 标注的简单使用 3.4.2 JDK的内置标注 3.5 泛型 3.5.1 为什么要使用泛型 3.5.2 泛型的一些特性 3.5.3 泛型的通配符 3.6 类...

    .NET之美:.NET关键技术深入分析

    1.4.1从类型设计谈起,Class还是Struct 1.4.2数据不一致的问题 1.4.3 常量性和原子性 1.4.4避免外部类型对类型内部的访问 1.5本章小结 第2章C#中的泛型 2.1理解泛型 2.1.1 为什么要有泛型 2.1.2类型参数约束...

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

    Java开发技术大全 电子版

    9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取...

    asp.net知识库

    asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 ...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    C#微软培训资料

    1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET.12 2.1 .NET 结构.12 2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 ...

    jquery插件使用方法大全

    (详情可以参见:jQuery.ajax文档) 此外,系统的可扩展性大大增强,可以附加各种数据处理器、过滤器和传输机制,为开发新的Ajax插件提供了方便。 2. 延迟对象 延迟对象(Deferred Object,jQuery.Deferred对象)是...

    JAVA上百实例源码以及开源项目

     在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...

Global site tag (gtag.js) - Google Analytics