1、首先了解下java几个加载器的基本原理:

Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个: 
     引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。 
     扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。 
     系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。

除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。

我们平时程序执行的时候在类加载器中寻找类的结构的顺序是:引导类加载器-》 扩展类加载器-》系统类加载器-》我们自定义的一些类加载器,每个类加载器都有自己的空间,同一个加载器里面的类的二进制名字必须是唯一的,当然同一个类也可以存在不同的加载器内存区域里面,不过我们寻找类的时候是按顺序找的,一但找的也就不会继续往下找了,最终也没找到就会报类不存在异常。 
    我们如果想动态加载类的话就要仿照我们用的服务器如tomcat和weblogic之类的,他们的开发模式也就是把所有的类都加载到自身的类加载器中,当文件被替换的时候他们就重新加载新的class到内存里面去,从而实现了类的动态加载。

2、使用概要:

File   file   =   new   File(jar文件全路径);   
  URL   url   =   file.toURI().toURL(); 
  URLClassLoader   loader   =   new   URLClassLoader(new   URL[]   {   url   });   
  Class   tidyClazz   =   loader.loadClass(所需class的含包名的全名);

详细说明:

我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成Java类,其实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。

参考代码:

public class ReloadClassLoader extends ClassLoader{
/**

* @param classFile class文件
* @return
* @throws Exception
*/
public Class<?> loadClass(File classFile){
// 一般的class文件通常都小于100k,如果现实情况超出这个范围可以放大长度
byte bytes[] = new byte[(int) classFile.length()];
FileInputStream fis = null;
Class<?> clazz = null;
try
{
fis = new FileInputStream(classFile);
int j = 0;
while (true)
{
int i = fis.read(bytes);
if (i == -1)
break;
j += i;
}
clazz = super.defineClass(null, bytes, 0, j);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return clazz;
}
/**

* @param JarFile Jar包
* @param className 全类名
* @return 
* @throws Exception
*/
public Class<?> loadJAR(File JarFile,String className){
Class<?> cls = null;
         if (!JarFile.exists()) {
             return null;
         }
        
try {
URL url = JarFile.toURI().toURL();
URLClassLoader classLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());
cls = classLoader.loadClass(className);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
         return cls;
}
}

Java 热更新 加载class和jar相关推荐

  1. java 运行 加载jar,java运行时加载额外的 jar 包或 class

    首先讲下java类加载的顺序 每个类加载器有自己的名字空间,对于同一个类加载器实例来说,名字相同的类只能存在一个,并且仅加载一次.不管该类有没有变化,下次再需要加载时,它只是从自己的缓存中直接返回已经 ...

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

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

  3. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  4. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...

    [Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新) 0 2014-05-07 18:00:06 使用该控件,可以根据url,参数,加载html记录模板(包含 ...

  5. 一文搞定Java热更新

    Java热更新 在持续交付的时代,重新部署一个新的版本只需要点击一下按钮.但在有的情况下,重新部署过程可能比较复杂,停机是不被允许的.所以JVM提供了另外一种选择:在不重启应用的前提下进行小幅改动,又 ...

  6. java虚拟机规范-加载、链接与初始化

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...

  7. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  8. 这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

    前言 package com.jvm.classloader;class Father2{public static String strFather="HelloJVM_Father&qu ...

  9. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)

    [1]类的生命周期 一个类从加载进内存到卸载出内存为止,一共经历7个阶段: 加载->验证->准备->解析->初始化->使用->卸载 其中,类加载包括5个阶段: 加载 ...

最新文章

  1. Uva 1220,Hali-Bula 的晚会
  2. python vtk mousemove_VTK的视点研究之三维空间漫游(转载)
  3. java 并发 变量_实例讲解Java并发编程之变量
  4. 《Android进阶之光》--事件总线
  5. java中的页面:JSP(已过时)
  6. c++ 4种新型的类型static_cast、dynamic_cast、reinterpret_cast、const_cast转换运算符
  7. DeepFake捏脸真假难辨,汤姆·克鲁斯比本人还像本人!
  8. 通信电子线路实验-调幅模块仿真(发送与接收)
  9. 头条搜集的Redis视频教程
  10. tomcat设置一级域名、二级域名访问指定项目
  11. 用python写一个专属字典生成器
  12. 安装安全防护软件有助于保护计算机不受侵害,安装安全防护软件有助于保护计算机不受病毒侵害。...
  13. 【51CTO学院三周年】随身携带的象牙塔
  14. NNS域名系统之域名竞拍
  15. vue项目引入并使用svg格式图标文件
  16. OSChina 周四乱弹 —— 紧箍咒的工作原理
  17. Go语言的GPM模型
  18. SpringBoot2.x系列教程03--新纪元之SpringBoot初相见
  19. 2020中国产业区块链名录:致敬在产业区块链领域发力的公司(机构)(持续补充)
  20. 仁兄,可曾听闻OpenVINO

热门文章

  1. Visual Studio 找不到platform.winmd错误
  2. 多款顶级好用的 Vue 表单设计器测评推荐,可拖拽生成表单
  3. 自热锅中发热包氧化钙 铝粒 碳酸氢钠的作用
  4. Windows安装MongoDB .zip绿色版
  5. 图论计算机科学,图论在计算机科学中应用.ppt
  6. Hadoop HA namenode宕机环境恢复
  7. diy:自制作四种智能小电器
  8. Sikuli内导入其他sikuli脚本的几个方法
  9. 2021-09-16什么是MQL4、MQL5语言?
  10. 程序员的故事: 拉里 埃里森