2.1 执行过程简介当编译和连接一个C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,因为这个二进制文件包含了对目标处理器的机器语言。而Java编译器把Java源文件的指令翻译成字节码,这种字节码就是Java虚拟机的“机器语言”。
与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
2.2 JVM中的ClassLoaderJVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。
另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类)ApplicationClassLoader负责加载应用程序自身的类。
当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。
2.3 执行ClassLoader例子什么时候JVM会使用ClassLoader加载一个类呢?当你使用java去执行一个类,JVM使用ApplicationClassLoader加载这个类;然后如果类A引用了类B,不管是直接引用还是用Class.forName()引用,JVM就会找到加载类A的ClassLoader,并用这个ClassLoader来加载类B。JVM按照运行时的有效执行语句,来决定是否需要装载新类,从而装载尽可能少的类,这一点和编译类是不相同的。
jvm classLoader architecture : a, Bootstrap ClassLoader/启动类加载器
b, Extension ClassLoader/扩展类加载器
c, System ClassLoader/系统类加载器
b, User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
类加载器的特性: 1, 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
Class Diagram: 类图中, BootstrapClassLoader是一个单独的java类, 其实在这里, 不应该叫他是一个java类。
它是在jvm启动时, 就被构造起来的, 负责java平台核心库。(具体上面已经有介绍) 启动类加载实现 (其实我们不用关心这块, 但是有兴趣的, 可以研究一下 ):
自定义类加载器加载一个类的步骤 :
ClassLoader 类加载逻辑分析, 以下逻辑是除 BootstrapClassLoader 外的类加载器加载流程:
用Class.forName加载类 即在一般情况下, 保证同一个类中所关联的其他类都是由当前类的类加载器所加载的.
上图中 ClassLoader.getCallerClassLoader 就是得到调用当前forName方法的类的类加载器
线程上下文类加载器
以上代码摘自sun.misc.Launch的无参构造函数Launch()。 使用线程上下文类加载器, 可以在执行线程中, 抛弃双亲委派加载链模式, 使用线程上下文里的类加载器加载类. 大部分java app服务器(jboss, tomcat..)也是采用contextClassLoader来处理web服务。 线程上下文从根本解决了一般应用不能违背双亲委派模式的问题. 使java类加载体系显得更灵活.
随着多核时代的来临, 相信多线程开发将会越来越多地进入程序员的实际编码过程中. 因此,
当然, 好东西都有利弊. 使用线程上下文加载类, 也要注意, 保证多根需要通信的线程间的类加载器应该是同一个,
自定义的类加载器实现 使用该接口, 可以动态的加载class文件.
例如, 而使用类加载接口, 并加上自己的实现逻辑, 还可以定制出更多的高级特性.
比如, 一个简单的hot swap 类加载器实现:
这个类的作用是可以重新载入同名的类, 但是, 为了实现hotswap, 老的对象状态 而新实例所依赖的B类如果与老对象不是同一个类加载器加载的, 将会抛出类型转换异常(ClassCastException). 为了解决这种问题, HotSwapClassLoader自定义了load方法. 即当前类是由自身classLoader加载的, 而内部依赖的类
还是老对象的classLoader加载的.
输出 A classLoader is sun.misc.Launcher$AppClassLoader@19821f |
|
- 浏览: 141460 次
- 性别:
- 来自: 广州
文章分类
发表评论
-
java中静态代码块的用法 static用法详解
2014-09-23 20:12 572(一)java 静态代码块 静态方法区别一般情况下,如果有些 ... -
Java内存空间详解
2014-09-23 20:10 680Java内存分配与管理是Java的核心技术之一,之前我们曾介 ... -
字符编码常识及问题解析
2014-09-22 17:39 495转自: http://sharecore.net ... -
字符串常量池
2014-08-29 17:25 1039转自:http://www.importnew.com/10 ... -
Eclipse Memory Analyzer (MAT)
2014-08-21 15:26 758Eclipse内存分析器(Eclipse Memory An ... -
eclipse 配置 maven 编译代码
2014-08-07 10:44 12095eclipse中另起了一个works ... -
XML入门文档
2014-08-05 18:47 695转自 : http://developer.5 ... -
JAVA程序设计中经常犯的低级错误
2014-08-04 11:10 948总结一下,自己平时写代码过程中经常犯的一些错误: 1. 从 ... -
Java抽象类与接口的区别
2014-07-16 16:50 645转自: http://www.importnew.com/ ... -
字符串数组和List的相互 转换
2014-07-14 14:49 1203一、字符串数组转换为List String[] s = ... -
spring四种依赖注入方式
2014-07-04 10:11 1006引用:http://blessht.iteye.com/bl ... -
JDBC查询数据库
2014-06-12 15:43 804JDBC API的核心组件:1.Dr ... -
Date类的相关资料
2014-05-14 14:43 454学习链接: http://www.blogjava.net ... -
JavaBeans,Pojo区别
2014-04-09 14:57 0JavaBeans是Java语言中可以重复使用的软件组件,实 ... -
Spring配置文件详解
2014-04-01 11:52 2517Spring 2.5配置文件详解(1) Spring ... -
eclipse快捷键大全(转载)
2014-03-15 15:10 528Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ct ... -
JAXB :xml 与javabean的相互转化
2014-03-12 11:35 0一、概念 JAXB ... -
String类中的hashCode()分析
2013-12-31 16:09 1827hashCode()这个方法是Object中定义的,因此,不 ... -
Java学习推荐书目
2013-12-31 11:26 523转自:http://jm-blog.aliapp.com/? ... -
JAVA序列化与反序列化
2013-12-31 10:33 780Java的序列化与反序列化应用的非常之广泛, ...
相关推荐
Java ClassLoader定制实例
java classloader classpath 张孝祥
破解java加密的ClassLoader.java,在classloader植入破解代码
理解Java ClassLoader机制
Java ClassLoader Tutorial
Sun 官方关于 ClassLoader原理的文章,值得一看
Understanding the Java ClassLoader
Java中ClassLoader的解析,从ClassLoader的角度分析了JVM,装载类,创建类的对象的整个过程,更清晰的了解JVM的运行机制。
深入了解Java_ClassLoader,Bytecde.pdf
Understanding the Java ClassLoader.pdf
java classloader 讲义-淘宝网
NULL 博文链接:https://sbiigu.iteye.com/blog/260456
java classLoader 的全面讲解 从基本概念到具体的应用 里面共有三份资料。
1.java classloader 的概述 2.java classloader 的分类 3.自定义 java classloader
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
ClassLoader类加载器讲解,理解JAVA类加载机制
了解 Java ClassLoader
详细介绍java中的类加载器的使用,以及在在使用过程中需要注意的知识点