热部署和类加载器

JAVA类加载器分析--热部署的缺陷(有代码示例,及分析) Eclipse 工程代码 博文链接:https://flyfoxs.iteye.com/blog/2080502 立即下载

热部署和类加载器

热部署

 

对于Java应用程序来说,热部署就是在运行时更新Java类文件。

 

热部署的原理是什么

想要知道热部署的原理,必须要了解java类的加载过程。一个java类文件到虚拟机里的对象,要经过如下过程。

 

首先通过java编译器,将java文件编译成class字节码,类加载器读取class字节码,再将类转化为实例,对实例newInstance就可以生成对象。

类加载器ClassLoader功能,也就是将class字节码转换到类的实例。

在java应用中,所有的实例都是由类加载器,加载而来。

一般在系统中,类的加载都是由系统自带的类加载器完成,而且对于同一个全限定名的java类(如com.csiar.soc.HelloWorld),只能被加载一次,而且无法被卸载。

这个时候问题就来了,如果我们希望将java类卸载,并且替换更新版本的java类,该怎么做呢?

     既然在类加载器中,java类只能被加载一次,并且无法卸载。那是不是可以直接把类加载器给换了?答案是可以的,我们可以自定义类加载器,并重写ClassLoader的findClass方法。想要实现热部署可以分以下三个步骤:

1、销毁该自定义ClassLoader

2、更新class类文件

3、创建新的ClassLoader去加载更新后的class类文件。

热部署与热加载

Java热部署与Java热加载的联系和区别

Java热部署与热加载的联系

1.不重启服务器编译/部署项目

2.基于Java的类加载器实现

 Java热部署与热加载的区别

部署方式

热部署在服务器运行时重新部署项目

热加载在运行时重新加载class

 实现原理

热部署直接重新加载整个应用

热加载在运行时重新加载class

 使用场景

热部署更多的是在生产环境使用

热加载则更多的实在开发环境使用

 

V2.class 覆盖 V1.class文件 会直接被加载吗?不会呀 重启后就可以加载新的了! 只会读取一次

自定义ClassLoader

package com.toov5.test;

import java.io.IOException;
import java.io.InputStream;
/*
 * 穿class文件路径地址然后 将其读入jvm中去
 * 
 */
public class MyClassLoader extends ClassLoader {

       @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
    
        try {
            //1获取文件名称
            String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
            //2、 文件名称
            InputStream iStream =this.getClass().getResourceAsStream(fileName);
            //3、读取字节
             byte[] bytes;
            bytes = new byte[iStream.available()];
             iStream.read(bytes);  
             //3、将读取Byte数组给jvm识别Class对象  
             return defineClass(name, bytes, 0, bytes.length);
        } catch (IOException e) {
            throw new ClassNotFoundException();
        }
 
    }

}

自定义一个类:

package com.toov5.test;

public class User {
   public void add(){
       System.out.println("我是版本1");
   }
}

实现:

package com.toov5.test;

import java.lang.reflect.Method;


public class Hotswap {

    public static void main(String[] args) throws InterruptedException, ClassNotFoundException {
        loadUser();
    }
    
    public static void loadUser() throws ClassNotFoundException{
        //专门加载类信息
        MyClassLoader myClassLoader= new MyClassLoader();
        //使用类加载器读取信息
        Class<?> findClass = myClassLoader.findClass("com.toov5.test.User");
        try {
            //反射初始化对象
             Object object = findClass.newInstance();
             //反射调用方法
             Method method  = findClass.getMethod("add");
             method.invoke(object);
             System.out.println(object.getClass());
             System.out.println(object.getClass().getClassLoader());
        } catch (Exception e) {
            
        }
    
    }
    
}

可以设计 每隔多久调用一次这个自自定义的类加载器方法~~~

 

 

关于类加载器


 

 

  Java程序有个类:

  System    jvm首先把类的字节码 加载到内存   这个.class放在 classPath下磁盘的某个路径下   这都是类加载器干的

   

   Java虚拟机中有多个类加载器,系统默认的三个主要的类加载器,每个负责加载特定位置的类:

   BootStrap   ExtClassLoader  AppClassLoader

   

   类加载器 也是个Java类,因为其他是Java类的类加载器本身也要被类加载器加载,显然必须有一个类加载器不是Java类,这个就是BootStrap(是C++的)

   Java虚拟机中的所有类加载器采用具有父子关系的树形结构进行组织,在实例化每个类加载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为期父类加载。

   

public class testClassLoader {
    public static void main(String[] args) {
        //得到这个类的类加载器的类的名字    类加载器属于一个类
        String name = testClassLoader.class.getClassLoader().getClass().getName();
        System.out.println(name);
    }
}

结果:

 

看下System:

public class testClassLoader {
    public static void main(String[] args) {
        //得到这个类的类加载器的类的名字    类加载器属于一个类
        String name1 = System.class.getClassLoader().getClass().getName();
        System.out.println(name1);
    }
}

 空指针异常了

 特殊的类加载器 不是Java类  

 只要是Class对象一定是由类加载器加载出来的 不可能不存在

 这个可能性是在跟前面 

System.class.getClassLoader()

没有这个对象

是因为特殊类加载器  C++写的那个。用Java程序去获得这个名字就是 Null了

 

循环打印下:

public class testClassLoader {
    public static void main(String[] args) {
        ClassLoader classLoader = testClassLoader.class.getClassLoader();
        while ( classLoader != null){
            System.out.println(classLoader.getClass().getName());
            classLoader = classLoader.getParent();
        }
        System.out.println(classLoader);
    }
}

 

 如果有两份,那么加载父类包下面的哦!

 

 

要想自己写类加载器,需要挂到爸爸下面。

 

 当Java虚拟机要加载一个类时候,到底派哪个类加载器去加载?

    首先当前线程的类加载器去加载线程中的第一个类

    如果类A中引用了类B, Java虚拟机将使用加载类A的类加载器来加载类B

    还可以直接调用ClassLoader.loadClass() 方法来指定某个类加载器去加载某个类

 

   每个类加载器加载类时候,现委托给上级类加载器

       当所有祖宗类的加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,不是再去找发起者类加载器的儿子,因为没有getChild方法,即便是有,如果多个儿子,找哪个呢?

    

 每个ClassLoader本身只能分别加载特定位置和目录中的类,但他们可以委托其他的类加载器去加载类,这就是类加载器的委托机制。类加载器一级一级委托到BootStrap类加载器,当BootStrap无法加载当前所需要加载的类时候,然后才一级一级回退到子孙类加载器进行真正的加载。当退回到最初的类加载器时候,如果它自己也不能完成类的加载,那就应报告ClassNotFountException异常

 

 自定义类加载器:


 

 待续

  

Java基于自定义类加载器实现热部署过程解析 主要介绍了Java基于自定义类加载器实现热部署过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 立即下载

相关推荐

WhatsApp注册流程逆向分析:从协议解析到风控对抗实战

移动应用安全分析的核心在于理解客户端与服务端的交互协议与验证机制。通过逆向工程,可以深入剖析应用的数据加密、传输与身份验证原理,这对于构建安全模型、进行自动化测试和风控策略研究具有重要技术价值。在即时通讯、金融支付等高安全要求场景中,掌握应用注册流程的底层实现是评估其安全性的关键。本文聚焦于使用动态分析工具如Frida进行Hook和流量抓包,结合设备指纹识别与模拟器检测技术,详细解析了大型应用的注册风控体系,为安全研究人员和开发者提供了从环境搭建到实战对抗的完整方法。

weixin_33935636的博客 316

spring boot: 热部署(一) run as – java application (spring-loader-1.2.4.RELEASE.jar)

spring boot: 热部署(一) run as – java application (spring-loader-1.2.4.RELEASE.jar) 如果使用的run as – java application的话,那么还需要做一些处理。 1.把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中, 2.然后把IDEA的run参数里VM参数设置为...

weixin_34162629的博客 491

【SystemVerilog笔记(一)】数据类型

(一)内建数据类型 1.按照四值逻辑和二值逻辑分类 四值逻辑类型:integer、logic、reg、wire等线网类型 二值逻辑类型:byte、shortint、int、longint、bit 2.按照有符号和无符号分类 有符号类型:byte、shortint、int、longint、integer 无符号类型:bit、logic、reg、wire等线网类型 ※记忆:按位定义的变量是无符号的。 (二)软件常用类型 1.定宽数组 在这里插入代码片 ...

cc__cc__的博客 1万+

java自定义类加载器,Springboot热部署,aop拦截,文件监听

java自定义类加载器,Springboot热部署

hello_qaz123的博客 1240

智能问数产品背后的Agent技术揭秘:从任务分解到工具调用的完整流程

本文深入解析智能问数产品背后的Agent技术,从任务分解到工具调用的完整流程。通过大模型驱动的语义理解和动态工具调度,Agent系统能高效处理复杂数据分析需求,显著提升响应速度和准确率。文章详细介绍了模块化架构、任务分解机制、动态工具调用及双通道记忆系统等核心技术,展示了大模型时代的新型数据分析范式。

weixin_30399821的博客 438

10、网络安全工具:Bettercap 与 Web 应用测试工具全解析

本文详细解析了网络安全工具Bettercap及其在中间人攻击和无线攻击中的应用,同时介绍了多种Web应用测试工具,如Amass、Cadaver、Dirb等,并探讨了工具的使用场景、流程、注意事项以及未来发展趋势,为网络安全测试提供了全面的指导。

u0v1w2x3的博客 227

八、类加载器与热部署

目录一、类加载简介1、类加载机制2、连接过程3、初始化二、静态代码块初始化三、 一、类加载简介 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令 当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载 1、类加载机制 将class文件字节码内容加载到内存中,并将

qq23001186的博客 1759

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

Java中的类加载器与热部署技术详解

热部署(Hot Deployment)指的是在应用程序运行过程中,无需停止整个应用程序或重启服务器,能够实现更新和替换某些部分(如类文件、配置文件等)并使其立即生效的技术。在Java开发中,热部署主要针对类文件的动态加载和替换。下面是一个简单的示例,演示如何通过自定义类加载器实现热部署的功能。");接下来,创建一个自定义类加载器try {} else {} } }try {} else {} } }@Overridetry {

微赚开发者技术分享博客 854

嵌入式SDIO 总线面试题及参考答案

SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。

大模型大数据攻城狮的专栏 1719

Python爬虫实战:爬取并分析电子商务平台用户评论数据

爬虫(Web Scraping)是指通过编写程序模拟浏览器行为,从网站中提取数据的过程。爬虫技术可以自动化地抓取网站上的信息,广泛应用于数据收集、价格监控、市场研究等多个领域。情感分析(Sentiment Analysis)是一种自然语言处理技术,用于确定文本的情感倾向。对于电子商务平台的评论数据,情感分析可以帮助商家了解消费者的反馈情绪,例如产品的好评、差评或中性评价。本文详细介绍了如何使用Python爬虫技术从电子商务平台抓取并分析用户评论数据。我们展示了如何通过requestsSelenium。

2201_76125261的博客 1175

java热部署和类加载器

参考https://www.cnblogs.com/pfxiong/p/4070462.html https://blog.youkuaiyun.com/u010648555/article/details/78356040 1、热部署是什么? 对于Java应用程序来说,热部署就是在运行时更新Java类文件。 2、热部署有什么用? 可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情...

u014203449的博客 1172

Uncaught ReferenceError: process is not defined

这个错误 Uncaught ReferenceError: process is not defined 通常出现在浏览器环境中,因为 process 是 Node.js 环境的内置对象,并不是浏览器原生支持的。因此,浏览器无法识别 process,导致该错误。在App.vue中加上以下代码就能够有效解决。

猿小白的博客 1740

类加载器 - 热部署原理和使用类加载器修改已部署的代码Demo

热部署 对于Java应用程序来说,热部署就是在运行时更新Java类文件。 场景:将代码发布到生产环境后,发现代码逻辑错误需要将add方法中加入参数String c,如何在不停机的情况下,将参数c加上去? >>> 使用热部署功能;首先生成新的User.class然后将旧版本有问题的User.class替换掉,并重新调用类加载器ClassLoader进行加载。 需要注意的是:如果只是替换掉旧的User.class文件是不生效的,必须要调用类加载器,让类加载...

祁_z 984

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

面试官问我“Tomcat 热加载热部署和类加载器原理”,我说“这就像火锅涮肉”,他直接懵了!

Tomcat热部署与类加载器解析:面试实战经验分享 本文通过一场生动的Java面试场景,深入浅出地讲解了Tomcat热部署的核心原理。重点剖析了WebappClassLoaderBase类加载器的独特性、热加载的触发机制(HostConfig监控目录变更)和类卸载流程(GC回收类加载器)。文章采用比喻手法(将热部署比作火锅涮肉),配合清晰的类加载器结构图和原理表格,系统性地呈现了Tomcat实现热部署的三大关键技术:独立类加载器、资源变更检测和上下文重载机制,为Java开发者理解容器机制提供了实用参考。

真正的大师永远怀着一颗学徒的心 447

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

类加载器的双亲委派模型和代码热部署

前言 最近看了《深入理解JVM》,发现它的内容确实在某些方面是很深入的,学习到了很多有趣的知识。但是限于自己的能力,有些地方看着也不是很理解,掌握的知识层次还是不够,可能还是要多动手实践、多看书了解相关的概念。今天看了类加载器相关的知识,因为它提到了代码的热更新(热部署),以前学习jsp的时候经常使用,所以就感觉很好奇,想来探究一下它的实现过程。所以就萌生了一个想法,结合自己学习过的知识,使用类加载器的知识来尝试写了一个简单的demo——关于代码的热部署。 这里需要读者先了解: 1.类加载器的概念 2.类加

qq_40734247的博客 1447

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

2019.12.10笔记——Spring Boot热部署的使用和实现自己的热部署(类加载器相关)

https://www.processon.com/view/link/5c10c089e4b0fd48199548fd springboot热部署 依赖如下 热部署添加后 我们在项目启动的时候 如果更改了代码,也不需要重新启动,只需要从重新编译一下更改的文件就可以直接反映更新的代码,就是点击下面的锤子按钮 类加载器 https://blog.youkuaiyun.com/qq_35262405/a...

ww0peo的博客 562

Spring Boot项目热部署/重启后报NoSuchFieldError?可能是DevTools和类加载器在捣鬼

本文深入解析Spring Boot项目热部署后出现NoSuchFieldError的根本原因,揭示DevTools的类加载隔离机制(BaseClassLoader与RestartClassLoader)如何导致字段丢失问题。通过典型故障场景分析,提供JPA实体类修改、配置类静态引用等案例的解决方案,并给出预防此类异常的编码规范和工具链建议。

weixin_30673611的博客 355

JAVA类加载器分析-比较热部署和"Hot Code Replace"

最近复习JAVA类加载的相关知识,看到了热部署的实现原理,突然感觉这个好像不是以前Eclipse调试Tomcat的时候,修改代码不需要重启就可以调试的功能.查阅资料比较之后,发现不需要重启就可以继续调试的功能是"Hot Code Replace",我个人比较这两者之间的区别如下:     1)如果源文件有修改 热部署会会导致JVM里面有2个不同的Class存在,他们的类加载器不一样.他...

flyfoxs 461

热部署引发的类型转换异常

热部署引发的类型转换异常 起因 主要公司有个老的项目,想合并,里面有个工作流,里面需要配置监听器,然后监听器需要用到spring管理的其他的类,然后如果用@Component,@Autowired来注入的话,项目启动会报找不到这个类的问题,然后我以为是有同名类,导致注入不进去,所以我改用@Component(“”)来声明,注入的时候,也用@Resource(name ="kaptchaProducer"``),但是注入的bean的时候,会报类型转换异常。 既然不让我用spring的主动注入,那我就用Spri

Wzy000001的博客 660

Java类加载器&热部署

Java类加载器类加载的机制的层次结构步骤一、类加载机制步骤二、连接过程步骤三、初始化类加载器的层次结构启动(Bootstrap)类加载器扩展(Extension)类加载器系统(System)类加载器、理解双亲委派模式双亲委派模式优势类加载器间的关系类加载器常用方法loadClass(String)findClass(String)defineClass(byte[] b, int off, in...

mozz_jinyi的博客 446

Spring热部署黑科技:类加载器的魔法变身术

Spring热部署核心原理 🧠类加载器的魔法用法 ✨自己实现的简易方案 💻生产级方案选型指南 🏭动手挑战:尝试用Java Instrumentation API实现更优雅的热替换!🎯#Spring #热部署 #类加载器 #Java #DevTools #开发效率。

全栈开发工程师 1124

JAVA热部署原理

JAVA热部署原理 1、热部署是什么? 对于Java应用程序来说,热部署就是在运行时更新Java类文件。 2、热部署有什么用? 可以不重启应用的情况下,更新应用。举个例子,就像电脑可以在不重启的情况下,更换U盘。 OSGI也正是因为它的模块化和热部署,才显得热门。 3、热部署的原理是什么? 想要知道热部署的原理,必须要了解java类的加载过程。一个java类文件到虚拟机里的对象,要经...

无良的奋斗首年的博客 4328

基础篇-16-打破双亲委派机制3-osgi和类的热部署

OSGi 框架和类的热部署可以有效地解决传统 Java 类加载机制中的双亲委派问题,使得应用程序能够在不重启的情况下进行模块更新和代码替换。它的类加载器模型和模块化设计提供了一种灵活的解决方案,尤其适用于需要频繁变更和更新的应用场景。

qq_41577703的博客 440

tomcat热部署的实现原理

类:tomcat 查看( 4128 ) / 评论( 2 ) / 评分( 5 / 0 ) 一.             概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。 对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务

kangojian的专栏 6883

SpringBoot实现热部署笔记

热部署

小新的博客 246
上一篇: ClassLoader
下一篇: Map实现缓存
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值