javassist字节码增强技术
一、前言:
简单理解就是在原来方法的前后添加新的代码(扩展之前方法的代码)
这个是springAOP切面的基础
(springAOP切面就是给原有代码前后增加新代码)(为了更方便扩充新功能<只编写下边main中代码>)
<Spring则是只需要编写"切面类" 就可以了>
二、代码:
2.1.导包:
<dependencies><dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>9.1</version></dependency><dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version></dependency>
</dependencies>
2.2.代码:
package com.java.jvm.bytecode.service;/*** 定义一个普通的业务对象,我们现在要通过一定* 的技术对这个对象的方法进行功能增强。* 例如:* 1)在方法体代码执行之前做一些事情* 2)在方法体代码执行之后做一些事情*/
public class ResourceService {public void handle(){System.out.println("ResourceService--handle");}
}
package com.java.jvm.bytecode;import com.java.jvm.bytecode.service.ResourceService;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;/*
基于此类为com.java.jvm. bytecode . service. ResourceService做功能增强
思考:
1)对目标类中的方法要进行功能增强的一个基本步骤是怎样的?
1.1)如何获取目标类(基于CtLassPool获取)
1.2)如何获取目标方法(基FctClass获取)
1.3)如何为方法进行功能增强(基FCtMethod实现)*/
public class JavassistDemo {public static void main(String[] args) throws Exception {//被AppClassLoader已经加载了ResourceService rs1=new ResourceService();//加上这一行代码后边的Javassist就会报异常//.CannotCompileException: by java.lang.ClassFormatError: loader (instance of// sun/misc/Launcher$AppClassLoader):// attempted duplicate class definition for name:// "com/java/jvm/bytecode/service/ResourceService"//大概意思是AppClassLoader类加载器视图加载已经加载过的一个类, 所以不能实现已经加载过的类,就不能替换//某个class已经运行(已经加载), 再次加载进行加强Javassist是行不通的//1.获取目标类(目标类的信息会封装到CtClass对象中)//本行代码会加载ResourceServiceCtClass ctclass= ClassPool.getDefault().get("com.java.jvm.bytecode.service.ResourceService");//2.获取目标方法信息CtMethod targetMethod=ctclass.getDeclaredMethod("handle");//3./3.执行方法功能增强//注意:{System.out.println("start");} 表示代码块//本案例执行一次会增强一次,执行第二次会增强第二次targetMethod.insertBefore("{System.out.println(\"start\");}");// insertAfter的时候会自动添加一行Object var2=null;(以后待研究)targetMethod.insertAfter("{System.out.println(\"end\");}");//4.创建新的字节码对象Class<?> aclass= ctclass.toClass();ResourceService rs=(ResourceService)aclass.newInstance();rs.handle();//原本的f_javassist_demo/target/classes/com/java/jvm/bytecode///下的serviceResourceService.class字节码是2022-05-21 16:02生成的 //执行了下边的writeFile()生成事件就变成了2022-05-21 16:03//将新的字节码对象以class文件的形式存储到磁盘ctclass.writeFile("f_javassist_demo/target/classes");}}
2.3.结果分析:
//上边案例执行之后ResourceService生成的字节码反编译之后如下
public void handle(){System.out.println("start");System.out.println("handle()");Object var2=null;System.out.println("end");
}
2022-05-21 16:02 ZhaoYQ
javassist字节码增强技术相关推荐
- 字节码增强技术 Byte Buddy 、Javassist、Instrumentation
概述 字节码增强技术 有 Byte Buddy .Javassist等多种. 如果是在同一个包中,没有问题,不需借助Instrumentation 如果是第三方包,想不修改代码的情况下实现代理技术,就 ...
- JVM插桩之一:JVM字节码增强技术介绍及入门示例
字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...
- ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出
作者:小傅哥 博客:https://bugstack.cn Wiki:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收 ...
- Java字节码增强技术
文章目录 字节码 字节码增强 字节码增强技术 字节码 字节码含义:待补充. Java为了能让Java程序编译一次到处运行,用Java 编译器将程序对源代码编译生成固定格式的字节码(.class文件)供 ...
- idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...
作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...
- 探针技术-JavaAgent 和字节码增强技术-Byte Buddy
能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...
- JAVA字节码增强技术之ASM
ASM是一款基于java字节码层面的代码分析和修改工具:无需提供源代码即可对应用嵌入所需debug代码,用于应用API性能分析,代码优化和代码混淆等工作.ASM的目标是生成,转换和分析已编译的java ...
- python字节码解析_从底层入手,解析字节码增强和Btrace应用
这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...
- 干货!Java字节码增强探秘
点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:美团技术团队 1. 字节码 1.1 什么是字节码? ...
最新文章
- C语言:构建一个二级链表并完成增删改查
- 错误信息 c语言实现_全国计算机等级考试二级C语言
- Python 线程和进程和协程总结
- Java集合之LinkedHashSet源码分析
- PHP语言 -- 发起流程
- CentOS 7 配置花生壳(phddns)自启动
- 联想服务器万全T260G3系统,联想万全T260G3服务器电子教室更易管理
- GP数据库获取指定时段的所有天数
- cesium加载天地图的卫星影像图
- 什么是B2B、B2C、C2C?
- 网络安全系列-XV: 网络异常流量的种类及特征
- L3 Sequence
- Linux学习(CentOS-7)---Linux开机流程
- java工具:通过文件头的魔数判断文件类型
- 童年依恋风格影响成年后的两性关系
- 每个前端都需要知道这些面向未来的CSS技术
- 怎么知道创元网配资平台靠不靠谱?
- 马化腾:搜索、电子商务硬仗一定要坚持打
- 7-2 实验二 银行利息结算
- 你还在为不会FreeStyle而烦恼吗?抓取数据,自制歌词