自定义类加载器

1、继承 java.lang.ClassLoader
2、检查加载的类是否已经被装载,若已经装载,直接返回
3、委派类加载请求给父类加载器,若父类能完成,返回父类加载器加载的Class实例
4、调用本类加载器findClass方法,试图获取对应字节码,若成功则调用defineClass导入类型到方法区,失败则返回异常。

import java.io.*;//继承 java.lang.ClassLoader
public class FileSystemClassLoader extends ClassLoader {private String rootDir;public FileSystemClassLoader(String rootDir){this.rootDir = rootDir;}//findClass方法@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {Class<?> c = findLoadedClass(name);//是否已被加载if (c!=null){return c;}else {//双亲委托ClassLoader parent = this.getParent();//避免在此停止try {c = parent.loadClass(name);}catch (Exception e){}if (c!=null){return c;}else {//获取对应字节数组byte[] classData = getClassData(name);if (classData == null){throw new ClassNotFoundException();}else{//利用defineClass导入类型到方法区c=defineClass(name,classData,0,classData.length);}}}return c;}//获取字节数组对应方法private byte[] getClassData(String name){String path = rootDir+"/"+name.replace('.','/')+".class";InputStream is = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();try {is = new FileInputStream(path);byte[] flush = new byte[1024];int len ;while((len = is.read(flush))!=-1){baos.write(flush,0,len);}return baos.toByteArray();}  catch (IOException e) {e.printStackTrace();return null;}finally {try {if (is!=null) {is.close();}} catch (IOException e) {e.printStackTrace();}}}
}

测试:同一个类被不同加载器加载,jvm认为是不同的

    public static void main(String[] args) throws ClassNotFoundException {FileSystemClassLoader loader = new FileSystemClassLoader("D:/JavaNote");FileSystemClassLoader loader02 = new FileSystemClassLoader("D:/JavaNote");Class<?> c = loader.loadClass("Test");Class<?> c2 = loader.loadClass("Test");Class<?> c3 = loader02.loadClass("Test");Class<?> c4 = loader.loadClass("java.lang.String");Class<?> c5 = loader.loadClass("Re.Test");System.out.println(c.hashCode());System.out.println(c2.hashCode());  //与c相同System.out.println(c3.hashCode());  //与c、c2相同,同一个类被不同加载器加载,jvm认为是不同的System.out.println(c4.hashCode());System.out.println(c5.getClassLoader()); //系统默认加载器System.out.println(c3.getClassLoader()); //自定义加载器System.out.println(c4.getClassLoader()); //null 引导类加载器}

(JavaSE 学习记录) 自定义类加载器相关推荐

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  2. Android进阶:十三、自定义类加载器加载加密类文件

    之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等. 其实笔者对类加 ...

  3. 自定义类加载器在复杂类加载情况下的运行分析

    在之前咱们都在研究自定义类加载器的一些东东,不过接一来的学习还会依托于之前咱们写的MyTest16这个自定义类加载器,这里先再回顾一下: public class MyTest16 extends C ...

  4. 自定义类加载器_jvm超详细探索自定义类加载器(值得收藏)

    原创:鲁班学院子牙老师 微信公众号搜索启明南 如果你想看懂本篇文章,需要你对类加载器有一定的了解.如JVM自带的类加载器.双亲委派.自定义类加载器.类加载每个阶段做了什么--如果你对这些知识还有夹生的 ...

  5. 请你详细说说类加载流程,类加载机制及自定义类加载器

    一.引言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载. 二.类的加载.链接.初始化 1.加载 类加载指的是将类的class文件读入内存,并 ...

  6. JVM——自定义类加载器

    0. 为什么需要自定义类加载器   网上的大部分自定义类加载器文章,几乎都是贴一段实现代码,然后分析一两句自定义ClassLoader的原理.但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚,因 ...

  7. JVM类加载机制、双亲委派机制、自定义类加载器、打破双亲委派机制

    1.类加载器 站在Java虚拟机的角度看,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机.JDK8中), ...

  8. 面试干货4——你对Java类加载器(自定义类加载器)有了解吗?

    类加载器 推荐:在准备面试的同学可以看看这个系列 一.类加载器的作用 二.Java虚拟机类加载器结构 1. 引导类(启动类)加载器 2. 扩展类加载器 3. 系统类加载器 三.类加载器的加载机制 1. ...

  9. java 扩展类加载器_java实现自定义类加载器

    各类加载器虽然以父子相称,但是没有继承关系 (视频教程推荐:java课程) 点入ClassLoader的源码查看样例:* * class NetworkClassLoader extends Clas ...

最新文章

  1. 使用windows.name解决js跨域数据通信
  2. lnmp环境搭建 wordpress 博客系统
  3. 面向.NET开发人员的Dapr——机密
  4. 【OpenCV】图像金字塔详解及编程实现
  5. linux 系列:[所有相关文章链接]
  6. CentOS7安装JDK完整步骤
  7. 中级通信工程师证书会过期吗
  8. 重置计算机网络设置路由器,重新设置路由器的步骤
  9. Java实现八皇后问题
  10. linux 检查zip是否损坏,用-v参数 unzip -v test.zip 检查zip文件是否损坏代常亮
  11. 搭建java环境和java学习
  12. java8判断当前时间是否大于某个时间
  13. Python实用功能之pdf文件转png图片数据
  14. 如何提高场馆的二次成交率?
  15. 信息发布类网站后台界面设计一点思考(整体布局)
  16. 12.1.2、Doris__基本使用、doris的基本命令、建表概念、语句、建表语法、建表方式(引擎存储规则)、导入数据的方式、支持的数据类型、rollup索引
  17. 使用Numpy创建数组_总结
  18. FilterConfig的用法是什么?
  19. OSChina 周四乱弹 —— 你妈是洗衣机的亲妈
  20. 常见的自然法则及管理启示

热门文章

  1. c++primer读书笔记
  2. Python爬取10529条《三十而已》热评,看看大家都说了些啥
  3. android java join_java中的join用法
  4. 网络流量监控软件——MRTG(Multi Router Traffic Grapher)
  5. BUG记录--Iconfont图标在IE8浏览器的兼容问题
  6. SVM-SMO算法C++实现
  7. 五笔打字:速成手册---半小时学会五笔打字
  8. 宝塔Linux面板添加网站站点
  9. html七彩文本,小程序解析富文本---文本内容(不含图片)
  10. 细胞识别图像处理项目总结