字节码是一种中间代码,它与特定平台无关。并且每个支持 Java 的平台都需要有相应的 JVM,负责解释和执行字节码。...字节码增强 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。...GitHub 地址:JBC 本文则介绍 ASM 字节码增强类库 ASM ASM 是一个 Java 字节码操作和解析框架。...ASM Core API ASM Core API 使用流式的方式根据字节码结构从上到下依次处理,性能很好,所以一般 ASM 增强字节码一般都使用 Core API。...应用场景 字节码增强: 实现 AOP,插入日志、性能监控等横切关注点。 代码生成: 动态创建类和方法,实现动态代理。 代码分析: 对现有代码进行静态分析。
本文重点着眼于字节码增强技术,从字节码开始逐层向上,由JVM字节码操作集合到Java中操作字节码的框架,再到我们熟悉的各类框架原理及应用,也都会一一进行介绍。...图15 jclasslib查看字节码 2. 字节码增强 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。...字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。接下来,我们将从最直接操纵字节码的实现方式开始深入进行剖析。 ?...故除此之外,我们再简单介绍另外一类框架:强调源代码层次操作字节码的框架Javassist。 利用Javassist实现字节码增强时,可以无须关注字节码刻板的结构,其优点就在于编程简单。...此外,我们平时使用的动态代理、AOP也与字节码增强密切相关,它们实质上还是利用各种手段生成符合规范的字节码文件。
Javassist 是一个开源的分析、编辑和创建Java字节码的类库. 其主要优点在于简单快速....先在池中, 找到我们要黑掉的类和方法. 2. 在方法体中插入增强语句 整个流程虽然非常简单, 但合理利用javassist API会完成更多功能. 三....Class clazz = ctClass.toClass(); // 类的字节码文件 ClassFile classFile = ctClass.getClassFile(); // 编译成字节码文件...3.6.2 方法体修改 // 在方法体前插入代码块 ctMethod.insertBefore(""); // 在方法体后插入代码块 ctMethod.insertAfter(""); // 在某行 字节码...小结 Javassist虽然性能上比ASM,bcel较差, 但不需要了解字节码命令, 对开发者要求也不那么高, 开发效率也很高.
在动态代理技术里,由于不管用户调用代理对象的什么方法,都是调用开发人员编写的 InvocationHandler 的 invoke 方法(这相当于 invoke 方法拦截到了代理对象的方法调用)。...,因为 JDK 最后生成的 proxy class 其实就是实现了代理类所代理的接口并且继承了 java 中的 Proxy 类(继承 Proxy 类是为了判断该类是否为代理类),通过反射找到接口的方法,...CGLIB 字节码增强是JDK动态代理的一个很好的补充, CGLIB 中最后生成的 proxy class 是一个继承代理类所代理的 class,通过重写被代理类中的非 final 的方法实现代理。...总结为: JDK 动态代理:代理类必须是接口或继承接口的类。 CGLIB 字节码增强: 代理类不能是 final,代理的方法也不能是 final(继承限制) 。...当一个类没有实现接口的时候,就会选用 CGLIB 代理的方式。
Java 还提供了另外一种方式:依赖 Java Agent 技术,修改目标方法的字节码,做到无侵入的埋点。这种利用 Java Agent 的方式的采集器,也叫做探针。...用户不需要理解深层的原理,就可以使用完整的监控服务 关于字节码的基础知识可以参考美团的这篇文章: 字节码增强技术探索:https://tech.meituan.com/2019/09/05/java-bytecode-enhancement.html...Java Agent 简介 Java Agent 是 Java 1.5 版本之后引⼊的特性,其主要作⽤是在 class 被加载之前对其拦截,已插⼊我们的监听字节码。...返回转换过的字节数组,在这个方法中可以做任意的类文件改写。...,执行结果如下: 总结 本文详细介绍 Java Agent 启动加载实现字节码增强关键技术的实现细节,字节码增强技术为测试人员进行性能监控提供了一种新的思路。
> newBuilder = builder; //调用插件的define方法去获取到动态类型构造器,就是去返回需要匹配方法的增强方法 for (ClassEnhancePluginDefine define...,并且添加到名字匹配器当中 classEnhancePluginDefines.forEach(classEnhancePluginDefine -> { //调用插件的实现方法,将需要增强的对象设置到...插件定义的顶级接口类 public interface ClassEnhancePluginDefine { /** * 需要增强的类 * * @return the string * @since..."; /** 需要增强的方法*/ private static final String DO_EXECUTE_METHOD_NAME = "doExecute"; /** 对应增强方法执行的类*/ private...= "handleResponse"; /** 对应增强方法执行的类*/ private static final Class<?
好,那么这样非入侵的探针方式是怎么实现的呢?如何去做方法的字节码增强? 在字节码增强方面有三个框架;ASM、Javassist、ByteCode,各有优缺点按需选择。...这在我们之前的字节码编程文章里也有所提到。 本文主要讲解关于 ASM 方式的字节码增强,接下来的案例会逐步讲解一个给方法添加 TryCatch 块,用于采集异常信息以及正常的出参结果的流程。...接下来我会一步步的带着你通过字节码增强的方式,来实现我们的监控需求。最终的完整的代码,可以通过关注公众号:bugstack虫洞栈 回复源码获取(ASM字节码编程)。 1....输出异常信息 在我们使用 ASM 字节码增强后,已经可以将方法拓展的非常的适合于监控了。...另外这里是我们通过字节码增强的方式进行改造方法,改造后这个方法反馈给我们的仍然是字节码,所以需要使用到 ClassLoader 进行加载到执行。
好,那么这样非入侵的探针方式是怎么实现的呢?如何去做方法的字节码增强? 在字节码增强方面有三个框架;ASM、Javassist、ByteCode,各有优缺点按需选择。...这在我们之前的字节码编程文章里也有所提到。 本文主要讲解关于 ASM 方式的字节码增强,接下来的案例会逐步讲解一个给方法添加 TryCatch 块,用于采集异常信息以及正常的出参结果的流程。...接下来我会一步步的带着你通过字节码增强的方式,来实现我们的监控需求。最终的完整的代码,可以通过关注「公众号」:bugstack虫洞栈 回复源码获取(ASM字节码编程)。 1....输出异常信息 在我们使用 ASM 字节码增强后,已经可以将方法拓展的非常的适合于监控了。...另外这里是我们通过字节码增强的方式进行改造方法,改造后这个方法反馈给我们的仍然是字节码,所以需要使用到 ClassLoader 进行加载到执行。
前言 在上一篇讲述了入门和实操https://cloud.tencent.com/developer/article/2360594 本章节使用字节码和byte-buddy来玩 通过字节码对方法增强 新建一个...Test.java 然后运行一下程序编译成字节码,然后将字节码拷贝到 resources 当中如下图: Test.java: public class Test { String name =...JVM 参数配置: 将你需要进行增强的 .class 文件放入 java-agent 工程的 resources 当中: 然后改写 PreMainAgent.java 改写之后的内容如下: /** *...class字节码 Arrays.stream(inst.getAllLoadedClasses()).forEach(allLoadedClass -> { /...class 字节数组"); //获取更改后的类class 字节数组 String path = "D:\\Develop\
提到字节码增强技术,相信用过 Spring 的小伙伴都会知道 Java Proxy 和 Cglib。...毕竟面试准备的八股文中说过,Spring 的动态代理有两种实现方式,在有接口存在的时候使用 Java Proxy,当没有接口的时候使用的是 Cglib。...这两种方式的区别不在本文的讨论范围之内,今天想给大家介绍了是另一个字节码增强技术 Byte Buddy。...总的来说,使用 Byte Buddy 有下面的优势: 无需理解字节码格式,简单易用的 API 能很容易操作字节码; 支持 Java 任何版本,库轻量,仅取决于 Java 字节代码解析器库 ASM 的访问者....intercept(MethodDelegation.to(Agent.class)) .make(); // 将 agent 字节码写入文件中
TABLES : tstc, "SAP Transaction Codes(SAP 事务代码) tadir, "Directory of Repository Objects(资源库对象的目录...) modsapt, "SAP Enhancements - Short Texts(SAP增强-短文件) modact, "Modifications(修正) trdir, "...TRDIR) tfdir, "Function Module(功能模块) enlfdir, "Additional Attributes for Function Modules(功能模块的附加属性...----Joi 版本更新V0.2(附加了根据程序名查询UserExit的功能),代码: *******************************************************...PARAMETERS: P_TCODE LIKE TSTC-TCODE, "事务码 P_PGMNA LIKE TSTC-PGMNA.
基于字节码的Java代码审计 之前看了基于字节码的Java代码审计工具的实现,最近终于有空可以好好看一下其是如何实现的了。本文并不会从代码出发,而是试图从字节码角度分析其可行性。...只要编译成为符合字节码规范的内容,均可以在Java虚拟机中运行。...至此字节码执行一个函数的过程就结束了,这里就可以进入下一个问题了 使用字节码进行审计 首先看这一段代码: public class RceYes{ public void eval(String...实现 上文已经找到了字节码代码审计的关键,那接下来如何通过代码去实现呢?首先第一个问题,如何将Class文件解析成字节码指令的形式。...这里就不得不提一下ASM了,作为字节码增强技术,它可以动态修改字节码或者是遍历类的结构,ASM此处就不进行深入展开了,我们单单看一下遍历类结构这一点,它会按照一定顺序逐语句对字节码进行解析,当解析到函数时我们就可以自定义一个局部变量表以及操作数栈来进行模拟操作
1.2字节码 字节码(Byte-code)是一种包含执行程序、由一序列 op 代码/数据对组成的二进制文件。字节码是程序的中间表示形式:介于人类可读的源码和机器码之间。...它经常被看作是包含一个执行程序的二进制文件,更像一个对象模型。字节码被这样叫是因为通常每个操作码 是一字节长,所以字节码的程度是根据一字节来的。...字节码也是由,一组操作码组成,而操作码实际上是对栈的操作,可以移走参数和地址空间,也可以放入结果。JAVA通过JIT(即时编译)可以将字节码转换为机器码。 字节码的实现方式是通过编译器和虚拟机器。...编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。在java中一般是用Javac编译源文件变成字节码,也就是我们的class文件。...2.字节码执行 2.1JVM桢栈结构: 方法调用在JVM中转换成的是字节码执行,字节码指令执行的数据结构就是栈帧(stack frame)。也就是在虚拟机栈中的栈元素。
Jvm 如何确定方法的参数的个数 找到 Method 的 DescriptionIndex 的属性,找到对应的描述,例如: public class AddMain { public static...java 代码,add 方法对应的代码是 (II)I,最后一个 I 代表返回值,这个代表两个整型的参数...., int b,String c,boolean d) { return a + b; } 同样,(IILjava/lang/String;Z)I 代表有4个参数,字符串的表示是...(本文完) 作者:付威 博客地址:http://blog.laofu.online 如果觉得对您有帮助,可以下方的RSS订阅,谢谢合作 如有任何知识产权、版权问题或理论错误,...本文是付威的网络博客原创,自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828: 点击加群 或发我邮件 laofu_online
(EntityInsertAction.java:83) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.engine.spi.ActionQueue.executeActions...(ActionQueue.java:604) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.engine.spi.ActionQueue.executeActions...(DefaultFlushEventListener.java:39) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.internal.SessionImpl.doFlush...(SessionImpl.java:1454) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] at org.hibernate.internal.SessionImpl.managedFlush...:98) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final] 这个异常是这个回滚的关键。
阿牛今天提了个问题:volatile关键字的字节码实现是怎么样的?为什么我把volatile加上和去掉得到的字节码时一样的? ?...image.png 回答:内存屏障的概念是针对CPU架构级别的,需要在JIT编译器生成机器码的时候才能看到。
同一段 Java 程序在编译后生成的字节码文件是唯一的,不会因为平台的不同而产生任何的变化。而同一段字节码跑在不同实现的 JVM 上,会产生不同的机器指令。...于底层而言,其实 Sun 公司针对不同的操作系统开发了不同版本的 JVM,而这些 JVM 则通过识别上层的字节码并向下解释给操作系统执行。...因此,你的同一段字节码在不同平台下的 JVM 上运行,会对应到不同的机器指令,以此实现了跨平台运行。...那么,本文就来分析一下这个「字节码」文件,解开它的神秘面纱。...其实 Code 属性表最主要的一个作用是,存储当前方法在编译后所生成的所有字节码指令,并记录所需局部变量表的大小等有关方法运行的信息。
,int j) { int f; if (i == j) { f = i + j; }else { f = i - j; } } 编译后的字节码...,并相减后将结果入栈 15: istore_3 //将相减的结果从栈顶弹出并赋值给局部变量表的第三个整型变量f 16: return.../跳转到EXIT标记处 ELSE: sub $r5,$r3,$r4 //如果不相等,则将r3寄存器和r4寄存器相减将结果放入r5寄存器 EXIT: 通过比较,其实也能看出来,Java字节码的入栈操作其实也就是放入寄存器中...public void print() { int sum = 0; for (int i = 0;i < 100;i++) { sum += i; } } 编译后的字节码...S5寄存器的值,如果如果结果为假跳转到EXIT标记i < 100 add $s3,$s4,$s3 //将s4寄存器和s3寄存器的值相加存入s3寄存器sum += i; addi $s4
Javassist 前面文章介绍的 ASM 入门门槛还是挺高的,需要跟底层的字节码指令打交道,优点是小巧、性能好。...Javassist 是一个性能比 ASM 稍差但是使用起来简单很多的字节码操作库,不需要了解字节码指令,由东京工业大学的数学和计算机科学系的教授 Shigeru Chiba 开发....Javassist使用户不必关心字节码相关的规范也是可以编辑类文件的。...类文件编辑 Javassist可以在运行时修改类的字节码,从而实现一些功能,比如动态修改类的字段、方法等。...字节码分析 Javassist可以对字节码进行分析,提取类的结构信息,比如类名、字段、方法等。
领取专属 10元无门槛券
手把手带您无忧上云