https://blog.csdn.net/u010833547/article/details/54312052

*************************************************************

1.C++编写的程序需要经过编译称为目标文件,然后在程序执行之前进行链接后才可以称为可以运行的可执行程序,这个链接可以发生在程序运行之前,也可以发生在程序运行后(在内核中完成链接过程)再被执行。(运行可以理解为双击打开)。而Java则只需要编译成字节码,然后交给JVM解析器去链接执行就可以了。(C++系列也拥有动态加载和动态链接等概念)

2.Java的动态加载实际上就是程序在执行过程中可以根据程序设定去加载需要被执行的字节码文件。

3.热替换属于动态加载的一种,但是热替换是特殊的动态加载机制。

4.动态加载在Java中有2种实现,第一种通过ClassLoader.loadClass()去加载,ClassLoader最高级别的类加载器,所有的类都归他管理,用loadClass加载的类,是未经过初始化的,所以很多静态变量和方法无法被使用,第二种方法则是,Class.forName().用这个方法加载的类已经经过初始化。

5.而如何实现热替换呢?首先我们要知道ClassLoader中的loadClass在加载类的时候会检测该类是否已经存在,如果存在则不会去加载,如果不存在则加载该类并缓存。所以默认的ClassLoader是无法实现热替换的。换句话说,要实现热替换就必须实现一个自己的MyClassLoader,实现一个自己的用于加载类的方法findClass(),在方法里面要做的事情就是读取本地字节码文件,只用父类的defineClass()方法去解析它。这样就可以获取新的类了,而旧的类由于ClassLoader不可达,所以会被GC回收。

下面是MyClassLoader的代码:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; public class MyClassLoader extends ClassLoader {
public MyClassLoader() {
} public Class<?> findClass(String name) throws ClassNotFoundException {
String classPath = MyClassLoader.class.getResource("/").getPath();
String fileName = name.replace(".", "/") + ".class";
File classFile = new File(classPath, fileName);
if(!classFile.exists()) {
throw new ClassNotFoundException(classFile.getPath() + " 不存在");
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ByteBuffer bf = ByteBuffer.allocate(1024);
FileInputStream fis = null;
FileChannel fc = null; try {
fis = new FileInputStream(classFile);
fc = fis.getChannel(); while(fc.read(bf) > 0) {
bf.flip();
bos.write(bf.array(), 0, bf.limit());
bf.clear();
}
} catch (FileNotFoundException var20) {
var20.printStackTrace();
} catch (IOException var21) {
var21.printStackTrace();
} finally {
try {
fis.close();
fc.close();
} catch (IOException var19) {
var19.printStackTrace();
} } return this.defineClass(bos.toByteArray(), 0, bos.toByteArray().length);
}
}
}

java中的动态加载和热替换的更多相关文章

  1. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  2. 浅析java中ClassLoader如何加载Class

    我的博客地址:https://blog.csdn.net/qq_41907991 ClassLoader是一个经常出现又让很多人望而却步的词.本文试图以最浅显易懂的方式来讲解ClassLoader,希 ...

  3. 解决tableView中cell动态加载控件的重用问题

    解决tableView中cell动态加载控件的重用问题 tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问 ...

  4. java——Class、动态加载

    Class和Object混淆了? Object: 任何类都是Object类的子类 Class: 任何类都是Class的实例对象 Class可以说是一种特殊的类,它表示的是类类型,Object仍然是Cl ...

  5. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  6. Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)

    需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现   反射的过程如下:     第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...

  7. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  8. Java实现窗体动态加载磁盘文件

    在使用图形界面操作系统时,当打开一个文件夹系统会自动列出该文件夹下的所有文件及子文件夹.本实例实现了类似的功能:首先让用户选择一个文件夹,程序会动态列出该文件夹下的所有文件:如果该文件是隐藏文件,就在 ...

  9. 通过源码浅析Java中的资源加载

    前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...

随机推荐

  1. hihocoder234周 计算不包含黑点的矩形个数

    题目链接 问题描述 一个棋盘有n条横线,m条竖线,上面有k个黑点,问有多少个不包含黑点的矩形. 数据范围: n和m最大为1000,k最大为10 方法一:动态规划 复杂度n*m*k. import ja ...

  2. 整理打印PI值

    准备锻炼背诵PI的小数,找到PI值: PI=3. 141592653589793238462643383279502884197169399375105820974944592307816406286 ...

  3. android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器

    一.基础知识点学习  1.Android体系结构 如图所示,android 架构分为三层: (1)最底层是linux内核,主要是各种硬件的驱动,如相机驱动(Camera Driver),闪存驱动(Fl ...

  4. 说说JSON和JSONP,也许你会豁然开朗,含jQuery使用jsonp用例

    [原创]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例  前言: 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了 ...

  5. 淘宝JAVA中间件Diamond详解之简介&快速使用 管理持久配置的系统

    http://my.oschina.net/u/435621/blog/270483?p=1 淘宝JAVA中间件Diamond详解(一)---简介&快速使用 大家好,今天开始为大家带来我们通用 ...

  6. hadoop遇到的问题及处理

    1:杀掉hadoop作业 列出作业 ./hadoop job -list 杀掉 ./hadoop job -kill job_id 1:某些节点出现running asprocess XXX. Sto ...

  7. java导出txt文件

    1:vm模板页面的代码片段 <div class="col-sm-1"> <button type="button" class=" ...

  8. golang学习笔记 ---数组与切片

    数组: golang数组包含的每个数据称为数组元素(element),数组包含的元素个数被称为数组长度(length). golang数组的长度在定义后不可更改,并且在声明时可以是一个常量或常量表达式 ...

  9. 【转】Tesla Model S的设计失误

    Tesla Model S的设计失误 这幅美丽的图片,就是红极一时的Tesla电动车Model S的内景.然而你有没有发现,其中有一些不大对劲的地方?虽然我看好电动汽车,它们环保,安静,运动敏捷,然而 ...

  10. Linux中断的系统调用

    早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行.该系统调用返回出错,其errno设置为EINTR.这样处理的理由是:因为一个信号 ...