classloader
2016-03-09 21:08
218 查看
Class.forName(classname)默认是用调用 ClassLoader.getCallerClassLoader()这个方法来获得调用者类的加载器,而调用者的类加载器再利用classLoader的委托模型去加载。其实每次new一个类的时候,也是通过 ClassLoader.getCallerClassLoader()去获得调用者类的加载器来加载的。
Java中的类加载器可以分为四类:
1 Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,并且它也会加载ExtclassLoader类。
2 ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.当时因为bootstrp loader不是JAVA写的,所以占在JAVA的角度来看,调用Extclassloader的getParent()返回的是null.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。
3 AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。
4 URLClassLoader
URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
有了这个加载器的继承体系以后,就可以清楚的知道委托模型是怎么实现的了,当一个加载器要加载一个类的时候,首先请求父加载器来加载,父加载器再请求父加载器来加载,依此类推,如果所有的父加载器都不能加载,那么才有自己加载,如果也不能加载,则出现NoClassDefFoundError错误.所以打包的时候,其实是将自己的类放在规定的地方,让框架已经实现的类加载器来加载,这样以来,就可以让框架来管理自己些的类的生命周期。在一般的情况下,我们自己写的类,默认都是由AppclassLoader来载入的,只要class的全名不和AppclassLoader的父加载器已经加载的类相同就OK。
Java中的类加载器可以分为四类:
1 Bootstrp loader
Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib以及%JAVA_HOME%/jre/classes中的类,并且它也会加载ExtclassLoader类。
2 ExtClassLoader
Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.当时因为bootstrp loader不是JAVA写的,所以占在JAVA的角度来看,调用Extclassloader的getParent()返回的是null.ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext中的jar文档,以及此路径下的所有classes目录。
3 AppClassLoader
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为ExtClassLoader。AppClassLoader主要负责加载classpath所指定的位置的类或者是jar文档。
4 URLClassLoader
URLClassLoader是我们可以自定义的加载器,我们可以通过指定一个URL对象来创建此加载器,它所加载路径就是URL所代表的逻辑位置。并且它的父加载器是AppClassLoader。
有了这个加载器的继承体系以后,就可以清楚的知道委托模型是怎么实现的了,当一个加载器要加载一个类的时候,首先请求父加载器来加载,父加载器再请求父加载器来加载,依此类推,如果所有的父加载器都不能加载,那么才有自己加载,如果也不能加载,则出现NoClassDefFoundError错误.所以打包的时候,其实是将自己的类放在规定的地方,让框架已经实现的类加载器来加载,这样以来,就可以让框架来管理自己些的类的生命周期。在一般的情况下,我们自己写的类,默认都是由AppclassLoader来载入的,只要class的全名不和AppclassLoader的父加载器已经加载的类相同就OK。
相关文章推荐
- ZOJ - 3469 Food Delivery 区间DP
- LeetCode : Substring with Concatenation of All Words [java]
- 突然就成了实验室负责人
- 最后再给大家介绍一种最简单的C#跨窗体操作
- MES案例研究2 – OPC网络阻塞
- /Users/alamps/AndroidStudioProjects/Demo11ListView
- 就拿胖子说事
- Quartz2D 绘制基本图形
- Python学习:多继承和super()
- 关于Masonry使用的注意事项
- 新的开始,想着梦想前进
- 使用 Linux 和 Hadoop 进行分布式计算
- linux常用命令
- XML和XPath使用方法备忘(转载)
- Spring JdbcTemplate API
- win10 UWP GET Post
- 多种多样的App主界面Tab实现方法——单独利用ViewPager实现Tab
- 企业数据总线(ESB)和注册服务管理(dubbo)的区别
- HDU 1853Cyclic Tour(网络流之最小费用流)
- linux用户权限