java双亲委派模型如何递归实现
- 以下是Classloader的中最重要的方法,也就是所谓的双亲委派模型。这个模型第一次在周志明的书上看到,当时看了只知道是类加载过程是首先是委托给父加载器,否则父不能加载,则自己加载,整个过程实则是一个很简单的递归过程,本文以实例讲解这个模型到底是咋实现的?
- protected Class<?> loadClass(String name, boolean resolve)
- throws ClassNotFoundException
- {
- synchronized (getClassLoadingLock(name)) {
- // First, check if the class has already been loaded
- Class c = findLoadedClass(name);
- if (c == null) {
- long t0 = System.nanoTime();
- try {
- if (parent != null) {
- c = parent.loadClass(name, false);
- } else {
- c = findBootstrapClassOrNull(name);
- }
- } catch (ClassNotFoundException e) {
- // ClassNotFoundException thrown if class not found
- // from the non-null parent class loader
- }
- if (c == null) {
- // If still not found, then invoke findClass in order
- // to find the class.
- long t1 = System.nanoTime();
- c = findClass(name);
- }
- }
- if (resolve) {
- resolveClass(c);
- }
- return c;
- }
- }
类加载器用来测试的Class文件对应的类
- public class TestLoaderClass {
- public TestLoaderClass()
- {
- System.out.println("加载器为"+TestLoaderClass.class.getClass());
- }
- }
- //自定义类加载器
import java.io.ByteArrayOutputStream;- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.nio.ByteOrder;
- public class MyClassLoader extends ClassLoader {
- //类加载器名称
- private String name;
- //加载类的路径
- private String path = "D:/";
- private final String fileType = ".class";
- public MyClassLoader(String name){
- //让系统类加载器成为该 类加载器的父加载器
- super();
- this.name = name;
- }
- //显示设置类加载器的父类加载器
- public MyClassLoader(ClassLoader parent, String name){
- //显示指定该类加载器的父加载器
- super(parent);
- this.name = name;
- }
- public String getPath() {
- return path;
- }
- public void setPath(String path) {
- this.path = path;
- }
- @Override
- public String toString() {
- return this.name;
- }
- /**
- * 获取.class文件的字节数组
- * @param name
- * @return
- */
- /**
- * 获取Class对象
- * @throws IOException
- */
- private byte[] getBytes(String name) throws IOException
- {
- //name=name.replace(".", "/");
- File f=new File(path+name+fileType);
- InputStream in=new FileInputStream(f);
- System.out.println(in.available()+"file");
- ByteArrayOutputStream bao=new ByteArrayOutputStream();
- int r=in.read();
- while(r!=-1)
- {
- bao.write(r);
- r=in.read();
- }
- System.out.println(bao.toByteArray().toString());
- return bao.toByteArray();
- }
- public Class<?> findClass(String name){
- byte[] data = null;
- try {
- data = getBytes(name);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println();
- return this.defineClass(name, data, 0, data.length);
- }
- public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
- //loader1的父加载器为系统类加载器
- MyClassLoader loader1 = new MyClassLoader("loader1");
- loader1.setPath("D:/lib1/");
- //loader2的父加载器为loader1
- MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");
- loader2.setPath("D:/lib2/");
- //loader3的父加载器为根类加载器
- MyClassLoader loader3 = new MyClassLoader(loader2, "loader3");
- loader3.setPath("D:/lib3/");
- Class<?> clazz = loader3.loadClass("TestLoaderClass");
- System.out.println(clazz.getClassLoader());
- ClassLoader cl=loader3;
- }
- }
java双亲委派模型如何递归实现的更多相关文章
- Java 双亲委派模型
1. Java 类加载器的分类 2. 双亲委派模型 Parents Delegration Model
- java双亲委派模型
Java类加载器(ClassLoader) 双亲委派模式要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器,请注意双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来 ...
- java虚拟机类加载机制和双亲委派模型
java虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型. 类的生命周期是从类被加载到虚拟机内存中,到卸 ...
- Java自定义类加载器与双亲委派模型
其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...
- java类加载器和双亲委派模型
一. 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class文件加载所需的类,主要场景用于热部署.代码热替换等场景. 系统提供3种的类加载器:Bootstrap ClassLoad ...
- @Java类加载器及双亲委派模型
类与类加载器 虚拟机设计团队把类加载阶段的"通过一个类的全限定名来获取此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个 ...
- 深入理解java虚拟机(九)类加载器以及双亲委派模型
虚拟机把类加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类加载器”. 类与类加载器 任 ...
- Java面试题之类加载器有哪些?什么是双亲委派模型
类加载器有哪些: 1.启动类加载器(Bootstrap ClassLoader):这个类加载器负责将存放在<JAVA_HOME>\lib目录中的,或被-Xbootclasspath参数所指 ...
- java虚拟机(二)--类加载机制和双亲委派模型
一.类的生命周期 加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Using).卸 ...
随机推荐
- HDFS 的可靠性
HDFS 的可靠性主要有一下几点: 冗余副本策略 机架策略 心跳机制 安全模式 效验和 回收站 元数据保护 快照机制 1.冗余副本策略 可以在hdfs-site.xml中设置复制因子指定副本数量 所有 ...
- CQRS学习——Cqrs补丁,async实验以及实现[其二]
实验——async什么时候提高吞吐 async是一个语法糖,用来简化异步编程,主要是让异步编程在书写上接近于同步编程.总的来收,在await的时候,相当于附加上了一个.ContinueWith(). ...
- Matlab实现ItemBasedCF算法
感谢开源大神,慢慢收集资料.网上资料很少,我在找如何用matlab处理movielens数据集时找到的. 用ml-100k这个数据集,包括主函数和相似度函数. 代码托管于CSDN.
- hibernate hql 大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承.多态 和关联之类的概念. ...
- 建立Clojure开发环境-使用IDEA和Leiningen
OS: Mac OS X 10.10 IDEA 14.0.2 Community Edition 安装Leiningen 按照http://leiningen.org/的指南安装lein 阅读Lein ...
- 安装ADT Cannot complete the install because one or more required items could not be found.
点击进行安装,将会弹出 错误提示是: Cannot complete the install because one or more required items could not be found ...
- android dialog点击其他区域消失
只需调用dialog对象的setCanceledOnTouchOutside方法,传入参数为true即可. 如下代码实现: //点击其他区域dialog消失 menuDialog.setCancele ...
- SSH配置log4j的方法
SSH使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB-INF ...
- jquery ajax 访问webServer的xml文件
最近项目中要使用到通过ajax访问webServer的xml文件,通过下面的方式可以直接访问webServer的xml文件,不需要在web.xml中进行任何配置.它的返回参数就是服务器上的xml文件. ...
- Nginx-location配置指南
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...