一、自定义类加载器

要创建用户自己的类加载器,只需要继承java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,即指明如何获取类的字节码流。

如果要符和双亲委派规范,则重写findclass方法(用户自定义类加载逻辑);要破坏的话,重写loadclass方法(双亲委派的具体逻辑实现)。

例子:

package classloader;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;class TestClassLoad {@Overridepublic String toString() {return "类加载成功。";}
}
public class PathClassLoader extends ClassLoader {private String classPath;public PathClassLoader(String classPath) {this.classPath = classPath;}@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {byte[] classData = getData(name);if (classData == null) {throw new ClassNotFoundException();} else {return defineClass(name, classData, 0, classData.length);}}private byte[] getData(String className) {String path = classPath + File.separatorChar+ className.replace('.', File.separatorChar) + ".class";try {InputStream is = new FileInputStream(path);ByteArrayOutputStream stream = new ByteArrayOutputStream();byte[] buffer = new byte[2048];int num = 0;while ((num = is.read(buffer)) != -1) {stream.write(buffer, 0, num);}return stream.toByteArray();} catch (IOException e) {e.printStackTrace();}return null;}public static void main(String args[]) throws ClassNotFoundException,InstantiationException, IllegalAccessException {ClassLoader pcl = new PathClassLoader("D:\\ProgramFiles\\eclipseNew\\workspace\\cp-lib\\bin");Class c = pcl.loadClass("classloader.TestClassLoad");//注意要包括包名System.out.println(c.newInstance());//打印类加载成功.}
}

二、Java热部署实现

热部署是在不重启Java虚拟机的前提下,能自动侦测到class文件的变化,更新运行时class的行为,Java类是通过Java虚拟机加载的,某个类的class文件在被classloader加载后,会生成对应的Class对象,之后就可以创建该类的实例。默认的虚拟机行为只会在启动时加载类,如果后期有一个类需要更新的话,单纯替换编译的class文件,Java虚拟机是不会更新正在运行的class。如果要实现热部署,最根本的方法是修改虚拟机的源代码,改变classloader的加载行为,使虚拟机能监听class文件的更新,重新加载class文件,这样的行为破坏性很大,为后续的JVM升级埋下了一个大坑。

更一种友好的方法是创建自己的classloader来加载需要监听的class,这样就能控制类加载的时机,从而实现热部署。

热部署步骤:

  1. 销毁自定义的classloader(被该加载器加载的class也会自动卸载)
  2. 更新class
  3. 使用新的ClassLoader去加载class

自定义类加载器与热部署相关推荐

  1. java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)

    首先纠正一个误区: 热部署不是我们在Eclipse里面修改了代码不用重启就可以持续调试. 详情可以参考上一篇博文: 热部署和"Hot Code Replace"的区别    htt ...

  2. 查看类的实现类mac_自定义类加载器实现热加载

    一.实现的需求 当一个java被修改后,系统无需重启,替换的类立即生效,这里以Work.java为例 二.实现的思路 1)难点分析 当项目在执行的时候,我们修改了Work.java,这个类的class ...

  3. JVM自定义类加载器在代码扩展性的实践

    一.背景 名单管理系统是手机上各个模块将需要管控的应用配置到文件中,然后下发到手机上进行应用管控的系统,比如各个应用的耗电量管控:各个模块的管控应用文件考虑到安全问题,有自己的不同的加密方式,按照以往 ...

  4. java的类加载器以及如何自定义类加载器

    ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的. 类加载器结构 结构:BootstrapClassLoader(祖父)–>ExtClassLoader ...

  5. 自定义类加载器以及打破双亲委派

    0x01 自定义类加载器 自定义类加载器加载一个类需要:继承ClassLoader,重写findClass,如果不想打破双亲委派模型,那么只需要重写findClass:如果想打破双亲委派模型,那么就重 ...

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

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

  7. 类加载机制、双亲委派机制深度解析以及如何自定义类加载器

    文章目录 1.类加载运行的全过程 2. JVM类加载器的初始化 3.双亲委派机制 4.编写自定义类加载器 5.(Tomcat)如何打破双亲委派机制 当我们运行一个类的时候,首先要通过类加载机制把类加载 ...

  8. 面试-JVM-类加载-类加载器--自定义类加载器-JVM调优

    文章目录 ==类加载== 谈谈你对类文件结构的理解?有哪些部分组成? 谈谈你对类加载机制的了解? 编写java代码是如何运行起来的? 类加载机制 类加载各阶段的作用分别是什么? 有哪些类加载器?分别有 ...

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

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

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

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

最新文章

  1. 智能家居隐私问题再遭热议:涉案设备中的数据究竟受不受保护?
  2. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
  3. 阿里巴巴高级技术专家:不要用沉默的方式一味地迎合别人的要求,据理力争或许才是作为的表现
  4. 手把手教你Tomcat配置环境变量以及验证方法
  5. 第一章 初始MySQL
  6. 使用多个struts-config配置文件,模块化
  7. 嵌入式科普:基本概念,设计流程,开发特点,如何学习
  8. 关于协方差矩阵需要注意的一个事项
  9. 20145217《网络对抗》 恶意代码分析
  10. python in memory_使用 in_memory 工作空间的注意事项
  11. visualstudiopython使用方法,使用python解析VisualStudio .csproj文件的最佳方法
  12. UML基础: 统一建模语言简介
  13. Windows Vista SP2 和 Windows Server 2008 SP2 已经发布
  14. 激光雷达的KPI与技术方案
  15. IDEA中使用JUnit---java测试类
  16. linux桌面环境组件下载,万能桌面小组件
  17. Hive建表语句解释
  18. select2 多选框
  19. pandas处理excel单元格合并后的列
  20. 试着在unity实现阴阳师抽卡效果

热门文章

  1. linux中Python3 引入CV2报错
  2. 数据结构--数组+链表实现哈希表
  3. mqtt 变为乱码 接受16进制字节流_常见乱码问题分析和总结
  4. android获取手机联系人信息(电话,邮箱,姓名,头像)
  5. 国内首家!携程周三、周五可在家“躺平”:76%员工主动报名 !网友:我酸了
  6. 什么是干货,什么是鸡汤?
  7. python实现生日祝福短信_Python实现好友生日提醒
  8. java迭代器怎么用_Java中迭代器的使用
  9. java rfid 写入_RFID读写器函数JAVA调用示例
  10. react前端封装接口弹出错误_react+ts打包发布后报Minified React error ..这种错误