| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 使用ASM实现简单的热部署-简单记录 -> 正文阅读 |
|
[Java知识库]使用ASM实现简单的热部署-简单记录 |
字节码增强技术?ASM ASM是对java字节码操纵框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class?文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。asm字节码增强技术主要是用来反射的时候提升性能的,如果单纯用jdk的反射调用,性能是非常低下的,而使用字节码增强技术后反射调用的时间已经基本可以与直接调用相当了。 spring 的Aop中使用的cglib的底层原理便是asm。 ASM采用的是责任链模式: ASM Core API可以类比解析XML文件中的SAX方式,不需要把这个类的整个结构读取进来,就可以用流式的方法来处理字节码文件。好处是非常节约内存,但是编程难度较大。然而出于性能考虑,一般情况下编程都使用Core API。在Core API中有以下几个关键类:
使用的场景有很多,我们这里只讲一个动态替换class文件的方法。? 我们这里的使用场景:热部署用我们公司的项目来说:项目为多个策略配置类替换,使用自定义类加载器加载的每个策略,然后反射生成一个个单例配置策略对象放在map中。策略数量有限。 因为线上的配置类会在线更换,还需要重新动态修改方法逻辑等,自己定义AOP功能,操作且要求项目不能随意重启。所以只能热部署的方式来加载要修改的class,自己定义了一个类加载器他继承了双亲委派机制,因为还有个父类要用apploader加载,因为一个类加载器多次,报类加载异常。所以,我想到了使用热部署的方式,更换策略对象。? 因为我们线上使用的是一个单例的策略类,把当前类替换即可(ps:这里也有另一种方式:java agent) 1,更新class类名这样类加载不会报错,实现热部署。 2,实现不依托spring实现的 自定义框架AOP . 1,引用jar 包
2,使用ASM(1):重命名class 原class?
新class?
执行完成后在指定路径下生成的class文件,我们就可用使用此类加载到jvm 反射生成实例对象。 F:\davinqi\src\main\java\com\my\asm\GoodAsm.class:? (2):重命名方法名 ?TODO? (3):方法修改增强 (4):字段修改
本文只是简单记录下,如果有错误希望大家能指正。 |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/18 17:07:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |