一、前言:

简单理解就是在原来方法的前后添加新的代码(扩展之前方法的代码)

这个是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字节码增强技术相关推荐

  1. 字节码增强技术 Byte Buddy 、Javassist、Instrumentation

    概述 字节码增强技术 有 Byte Buddy .Javassist等多种. 如果是在同一个包中,没有问题,不需借助Instrumentation 如果是第三方包,想不修改代码的情况下实现代理技术,就 ...

  2. JVM插桩之一:JVM字节码增强技术介绍及入门示例

    字节码增强技术:AOP技术其实就是字节码增强技术,JVM提供的动态代理追根究底也是字节码增强技术. 目的:在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修 ...

  3. ASM字节码编程 | 用字节码增强技术给所有方法加上TryCatch捕获异常并输出

    作者:小傅哥 博客:https://bugstack.cn Wiki:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有所收 ...

  4. Java字节码增强技术

    文章目录 字节码 字节码增强 字节码增强技术 字节码 字节码含义:待补充. Java为了能让Java程序编译一次到处运行,用Java 编译器将程序对源代码编译生成固定格式的字节码(.class文件)供 ...

  5. idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

    作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...

  6. 探针技术-JavaAgent 和字节码增强技术-Byte Buddy

    能够基于Java Agent编写出普通类的代理 理解Byte Buddy的作用 能够基于Byte Buddy编写动态代理 1 Byte Buddy Byte Buddy 是一个代码生成和操作库,用于在 ...

  7. JAVA字节码增强技术之ASM

    ASM是一款基于java字节码层面的代码分析和修改工具:无需提供源代码即可对应用嵌入所需debug代码,用于应用API性能分析,代码优化和代码混淆等工作.ASM的目标是生成,转换和分析已编译的java ...

  8. python字节码解析_从底层入手,解析字节码增强和Btrace应用

    这篇文章聊下字节码和相关的应用. 1.机器码和字节码 机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据. 通常意义上来 ...

  9. 干货!Java字节码增强探秘

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 来源:美团技术团队 1. 字节码 1.1 什么是字节码? ...

最新文章

  1. C语言:构建一个二级链表并完成增删改查
  2. 错误信息 c语言实现_全国计算机等级考试二级C语言
  3. Python 线程和进程和协程总结
  4. Java集合之LinkedHashSet源码分析
  5. PHP语言 -- 发起流程
  6. CentOS 7 配置花生壳(phddns)自启动
  7. 联想服务器万全T260G3系统,联想万全T260G3服务器电子教室更易管理
  8. GP数据库获取指定时段的所有天数
  9. cesium加载天地图的卫星影像图
  10. 什么是B2B、B2C、C2C?
  11. 网络安全系列-XV: 网络异常流量的种类及特征
  12. L3 Sequence
  13. Linux学习(CentOS-7)---Linux开机流程
  14. java工具:通过文件头的魔数判断文件类型
  15. 童年依恋风格影响成年后的两性关系
  16. 每个前端都需要知道这些面向未来的CSS技术
  17. 怎么知道创元网配资平台靠不靠谱?
  18. 马化腾:搜索、电子商务硬仗一定要坚持打
  19. 7-2 实验二 银行利息结算
  20. 你还在为不会FreeStyle而烦恼吗?抓取数据,自制歌词

热门文章

  1. python :Bokeh  ValueError: Out of range float values are not JSON compliant
  2. 爪哇语言单态创立性模式介绍
  3. 【数据结构基础】之数组介绍,生动形象,通俗易懂,算法入门必看
  4. 主流车标的五大特征值百万的车标设计优漫动游
  5. idea如何全局替换
  6. mysql merge 语句_Mysql merge引擎介绍
  7. 参加的马拉松比赛记录
  8. VUE+前端数据存储indexDB
  9. 共享计算机添加不上去,电脑连不上共享打印怎么解决
  10. java基础梳理及感悟