1、用户自定义的类加载器:

要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用。

findClass
protected Class<?> findClass(String name)throws ClassNotFoundException
使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。
参数:
name - 类的二进制名称
返回:
得到的 Class 对象
抛出:
ClassNotFoundException - 如果无法找到类
从以下版本开始:
1.2


创建用户自定义的类加载器:

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;}@Overridepublic String toString() {return this.name;}/**
     * 获取.class文件的字节数组
     * @param name
     * @return
     */private byte[] loaderClassData(String name){InputStream is = null;byte[] data = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();this.name = this.name.replace(".", "/");try {is = new FileInputStream(new File(path + name + fileType));int c = 0;while(-1 != (c = is.read())){baos.write(c);}data = baos.toByteArray();} catch (Exception e) {e.printStackTrace();} finally{try {is.close();baos.close();} catch (IOException e) {e.printStackTrace();}}return data;}/**
     * 获取Class对象
     */@Overridepublic Class<?> findClass(String name){byte[] data = loaderClassData(name);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的父加载器为loader1MyClassLoader loader2 = new MyClassLoader(loader1, "loader2");loader2.setPath("D:/lib2/");//loader3的父加载器为根类加载器MyClassLoader loader3 = new MyClassLoader(null, "loader3");loader3.setPath("D:/lib3/");Class clazz = loader2.loadClass("Sample");Object object = clazz.newInstance();}
}

public class Sample {public Sample(){System.out.println("Sample is loaded by " + this.getClass().getClassLoader());new A();}
}

public class A {public A(){System.out.println("A is loaded by " + this.getClass().getClassLoader());}
}

当执行loader2.loaderClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader1从D:/lib1/目录下成功的加载了Sample类,因此laoder1是Sample类的定义类加载器,loader1和loader2是Sample类的初始类加载器。

当执行loader3.loadClass("Sample")时,先由它上层的所有父加载器尝试加载Sample类。loader3的父加载器为根类加载器,它无法加载Sample类,接着loader3从D:/lib3/目录下成功地加载了Sample类,因此loader3是Sample类的定义类加载器即初始类加载器。

在Sample类中主动使用了A类,当执行Sample类的构造方法中的new A()语句时,Java虚拟机需要先加载Dog类,Java虚拟机会勇Sample类的定义类加载器去加载Dog类,加载过程也同样采用父亲委托机制。

2、不同类加载器的命名空间关系:

同一个命名空间内的类是相互可见的。

子加载器的命名空间包含所有父加载器的命名空间。因此子加载器加载的类能看见父加载器加载的类。例如系统类加载器加载的类能看见根类加载器加载的类。

由父加载器加载的类不能看见子加载器加载的类。

如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见。

当两个不同命名空间内的类相互不可见时,可以采用Java的反射机制来访问实例的属性和方法。

转载自:http://www.itzhai.com/java-virtual-machine-notes-custom-class-loader-implementation-and-use-of.html

转载于:https://www.cnblogs.com/chenying99/archive/2013/04/02/2994642.html

JVM 自定义的类加载器的实现和使用相关推荐

  1. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  2. 【深入理解JVM】:类加载器与双亲委派模型

    转载自  [深入理解JVM]:类加载器与双亲委派模型 类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段" ...

  3. 自定义文件系统类加载器

    类加载器的层次结构(树状结构) • 引导类加载器(bootstrap class loader) – 它用来加载 Java 的核心库(JAVA_HOME/jre/lib/rt.jar,或sun.boo ...

  4. JVM——深入理解类加载器

    类加载器相关内容有很多,大概分以下几个关键点进行学习, 参考链接 https://www.bilibili.com/video/av47756459 目录 概览 JVM与程序的生命周期 类加载器生命周 ...

  5. 【JVM】Java类加载器设计原理(ClassLoader源码解读/ SPI机制/ 绕开双亲委派/ 常见Java虚拟机)

    目录 1. 什么是类加载器 2. 类加载器加载的过程 3. Class文件读取来源 4. 类加载器的分类 5. 那些操作会初始化类加载器 6. 类加载器的双亲委派机制 6.1 双亲委派机制机制的好处 ...

  6. java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...

    Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...

  7. JVM之Java类加载器

    前言 通过对Java类加载机制的了解,可以知道大概流程和各自的功能.其中类加载部分的功能是把类的Class文件读入内存,并创建java.lang.Class对象.这部分功能是由类加载器完成的. 1.类 ...

  8. JVM有哪些类加载器?

    站在Java虚拟机的角度来看,只存在两种不同的类加载器: 1.启动类加载器(Bootstrap ClassLoader),使用C++语言实现,是虚拟机自身的一部分: 2.其他所有的类加载器,由Java ...

  9. 欧尼酱讲JVM(03)——用户自定义类加载器

    用户自定义类加载器 在Java的日常应用程序开发中,类的加载几乎是由"引导类加载器,扩展类加载器,系统类加载器"这三种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来 ...

最新文章

  1. Thymeleaf 标准表达式语法
  2. c语言学习之用筛选法求100之内的素数。
  3. GAN之父NIPS 2016演讲现场直击:全方位解读生成对抗网络的原理及未来(附PPT)
  4. kitti pkl可视化_KITTI 3D Lidar 数据可视化
  5. 95-140-110-源码-transform-算子keyBy
  6. 超实用的浏览器插件:CSDN 一键搜索、自定义工具、全站去广告、一键美化等
  7. 【Go】blockchain-tutorial 区块链技术教程
  8. 【Love2d从青铜到王者】第七篇:Love2d之对象
  9. vim 剪贴板历史插件
  10. 【HDU5442】 Favorite Donut(后缀数组)
  11. 1.3寸IIC OLED SH1106和Arduino库的适配性鸡肋问题
  12. js 爱心随鼠标移动 产生 并 消散 (源码)
  13. 大数据最佳实践-flink
  14. 机器视觉中的像素、分辨率、灰度值等概念
  15. 《ASP.NET AJAX 应用剖析立即上手》简体版即将上市!
  16. “信任机制”才是数字化时代发展中的精髓所在
  17. 2019全球人才竞争力指数显示,华盛顿特区在城市排名中表现最出色
  18. opencv cpu指令集SSE/AVX
  19. 曾国藩秘而不宣,老实人有这3个软肋,再闷头苦干也不会被重用
  20. 传智168期 SSH网上商城笔记day41~day45(2017年4月15日15:57:30)

热门文章

  1. win7双系统,暴力删除ubuntu后出现grub rescue解决
  2. Jupyter notebook中怎么添加Pytorch运行环境
  3. C—蓝彗星(差分问题)
  4. E. 数好多好多猴(南阳理工oj—21新生第二场招新赛)
  5. 嵌入式linux 零基础-实践起步 --- 003 --- 交叉编译中环境变量PATH的设定
  6. react html编辑器,react项目中使用富文本编辑器
  7. 设置网页打开默认全屏_微信公众号里的视频不能进行全屏播放的解决方法
  8. textarea怎么占满整个td_保健品为什么偏偏盯上老人?作为子女,应怎么面对老人狂买保健品...
  9. sim7020c功耗_SIM7020C物联网NB-IOT模块 simcom代理
  10. php如何按日期统计,关于按日获取统计信息:按日期获取统计信息 – 日期时间列 – mysql / php...