什么时候我们需要修改java字节码

问题描述

spring,hibernate都有用到cglib, javassist来修改java字节码但是我不是很清楚为什么要这样做?以及他们是怎么做到的是在运行时还是编译时修改的?他们怎么确保修改后的语义是正确的呢

解决方案

javassist没有用过,说说cglib在AOP中,Java原生自带的模式需要依赖于接口,但是一些实现里面,是通过继承来实现的,压根就没有接口,或者只有很底层的接口。这种场景下,就没办法通过接口的这种动态代理方式来实现动作拦截。所以只好依赖于cglib。当然,最优雅的还是通过接口的方式,cglib只不过是无奈的选择罢了。另外,cglib是运行时动态修改字节码的。

时间: 2025-01-01 15:45:48

什么时候我们需要修改java字节码的相关文章

Java字节码修改框架ASM

字节码相对Java的意义类似汇编相对C的意义,底层了解的越多越深入,程序就越神奇,一切想法皆有可能实现.学习了下字节码框架ASM,总结分享下: API概述. 一.ASM库提供了两类API接口模型来产生或者修改类字节码: (1)核心API: 基于事件,每个事件代表类的一个元素,如头事件.方法事件.字段事件等.特点是更快耗费更少的内存.(2)树型API: 基于对象树状结构,字段方法等都可以看做对象树的一部分.使用相对简单,但耗费内存. 二.API包结构大致如下: (1)事件.解析器.生产器类API在

使用ASM操作Java字节码,实现AOP原理

本文通过一个的例子来实现:使用ASM动态生成Java字节码文件(.class) 或者 加载字节码后动态修改字节码,添加我们需要执行的代码,来模拟实现Spring AOP. 年底了,也没心情抠字了,把写demo包含的几个类代码直接贴出来吧,代码拷贝下来后可以直接使用,不会有什么其他错误. 使用 asm-5.0.3.jar demo工程的package为com.shanhy.demo.asm.hello 5个Java文件: AopClassAdapter.java 用来处理哪些方法需要进行修改 Ao

关于java字节码框架ASM的学习

一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称.方法.属性以及 Java 字节码(指令).ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类. 使用ASM框架需要导入asm的jar包,下载链接:

掌握Java字节码(转)

Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就是你写的源代码的中间表现形式,也就是你的代码编译后的产物.你的class文件就是字节码. 简单点说,字节码就是JVM使用的代码集,它在运行时可能会被JIT编译器编译成本地代码. 你玩过汇编语言或者机器代码吗?字节码就是类似的东西,不过业界中许多人也很少会用及它,因为基本没这个必要.然而它对于理解程序

Java字节码(.class文件)格式详解(一)

小介:去年在读<深入解析JVM>的时候写的,记得当时还想着用自己的代码解析字节码的,最后只完成了一部分.现在都不知道还有没有保留着,貌似Apache有现成的BCEL工程可以做这件事.当时也只是为了学习.这份资料主要参考<深入解析JVM>和<Java虚拟机规范>貌似是1.2版本的,整理出来的.里面包含了一些自己的理解和用实际代码的测试.有兴趣的童鞋可以研究研究.嘿嘿.要有错误也希望能为小弟指点出来,感激不尽.:) 1.总体格式 Class File format type

Java字节码(.class文件)格式详解(三)

2.11 在ClassFile.method_info.field_info中同时存在的Attribute 2.11.1     Synthetic Attribute Synthetic Attribute用于指示当前类.接口.方法或字段由编译器生成,而不在源代码中存在(不包含类初始函数和实例初始函数).相同的功能还有一种方式就是在类.接口.方法或字段的访问权限中设置ACC_SYNTHETIC标记.   Synthetic Attribute由JDK1.1中引入,以支持内嵌类和接口(neste

通过Java字节码发现有趣的内幕之String篇(上)(转)

原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知识进行介绍,如果想了解更多的Java字节码或对其感兴趣的朋友可以先阅读字节码基础:JVM字节码初探. String字面量可以通过'=='判断两个字符串是否相同,是因为大家都知道'=='是用来判断两个对象的值引用地址是否一致,两个值一样的字符串字面量定义是否指向同一个值内存地址呢?答案是肯定的. 1

Java字节码深入解析

一:Java字节代码的组织形式 类文件{ OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组 } 二:查看方法 --- javap命令 例子:有一个Java类Demo.java public class Demo {      private String str1;      private String str2;      private

通过java字节码分析学习对象初始化顺序_java

复制代码 代码如下: mockery.checking(new Expectations() {            {               one(new Object()).toString();               will(returnValue(""));           }       }); 下面写一个写一个简单的类演示这个例子 复制代码 代码如下: public class Test {     int i = 1;    {        int