
字节码
ljz2016
这个作者很懒,什么都没留下…
展开
-
ASM框架使用(一)--初识
ASM框架是一个致力于字节码操作和分析的框架,它可以用来修改一个已存在的类或者动态产生一个新的类。ASM提供了一些通用的字节码转换和分析算法,通过这些算法可以定制更复杂的工具。ASM提供了其它字节码工具相同的功能,但是它更关注执行效率,它被设计的更小更快,它被用于以下项目:openjdk,实现lambda表达式调用, Nashorn编译器Groovy和Kotlin编译器Cobertura...原创 2018-08-02 10:38:58 · 30256 阅读 · 2 评论 -
Agent agentmain+ASM记录方法运行时参数信息
agentmain提供了运行时修改指定进程中字节码的能力,配合ASM框架,达到随时修改字节码的效果。agentmain方法:public static void agentmain(String agentArgs, Instrumentation inst){ System.out.println("Agent Main called"); inst.addT...原创 2018-11-21 16:59:23 · 1963 阅读 · 0 评论 -
Java agent+ASM实战--监控所有方法执行时间
本文建立在对instrumentation和agent有初步的了解的前提下阅读,关于这2个类的讲解在其它文章中。这是一个maven项目,pom中需要的配置,lib中有asm的jar包 <plugin> <artifactId>maven-compiler-plugin</artifactId&原创 2018-11-16 13:44:48 · 7251 阅读 · 1 评论 -
ASM框架使用(四)--泛型与注解
泛型对于泛型类型Type的解析,必须按照下面的顺序访问方法签名按照下面的顺序访问类签名的顺序其中大部分方法都会返回一个SignatureVisitor,用于访问一个type签名。SignatureVisitor返回SignatureVisitors(不能返回null)。ASM提供SignatureReader和SugnatureWriter用于解析和创建签名。SignatureRea...原创 2018-10-28 23:48:39 · 4597 阅读 · 3 评论 -
ASM框架使用(三)--方法修改以及创建
在jdk 1.6以后编译的类,除了字节码指令以外,还多了一些栈映射桢(stack map frames),用来提高虚拟机校验字节码的速度的。stack map frames反映了字节码执行过程中,栈帧的变化。stack map frames中有一种特殊类型Uninitialized(label),它先分配内存,但是不初始化,它只有初始化方法可以被调用。一旦被初始化,则发生在这个类型上的所有事件...原创 2018-10-24 16:07:11 · 8157 阅读 · 1 评论 -
ASM框架使用(五)--Tree API修改类和方法
Tree API通过ClassNode创建和修改类,ClassNode类的API:创建一个类:原创 2018-10-30 15:02:35 · 2584 阅读 · 0 评论 -
Instrumentation与ClassFileTransformer--字节码转换工具
一个代理实现ClassFileTransformer接口用于改变运行时的字节码(class File),这个改变发生在jvm加载这个类之前。对所有的类加载器有效。class File这个术语定义于虚拟机规范3.1,指的是字节码的byte数组,而不是文件系统中的class文件。接口中只有一个方法:byte[] transform( ClassLoader loader...原创 2018-10-23 16:57:15 · 9704 阅读 · 0 评论 -
Java虚拟机(十二)--字节码解析附录
JVM常量池元素编号常量池元素名称tag位标识含义1CONSTANT_Utf8_info1utf-8编码的字符串2CONSTANT_Integer_info3整型字面量3CONSTANT_Float_info4浮点型字面量4CONSTANT_Long_info5长整型字面量5CONSTANT_Double_info6双...原创 2018-10-03 00:07:39 · 287 阅读 · 0 评论 -
java虚拟机(七)--常用指令
一、常量入栈指令 分为const,push,ldc。const系列,常量包含在指令本身里, push指令主要包括 bipush(8位),sipush(16位)。比如 bipush 50 ldc接收 8位参数(指向常量池中int,float,string的索引),ldc_w接收16位参数。ldw2_w接收的参数指向常量池long,double类型索引。 二、局部变量压栈 xload(i...原创 2018-08-20 16:11:03 · 1220 阅读 · 0 评论 -
ASM框架使用(二)--类的简单变动以及工具类的使用
asm 包是asm框架的core包。 这篇介绍怎么用asm创建和修改编译后的class。Java源码中类型,在字节码中是用以下类型代表的: 方法描述(方法名不在方法描述中,在常量池中): asm创建和改变Java字节码是通过ClassVisitor抽象类, class vistor必须按照以下执行顺序: classreader用来解析一个已存在的类。 下面是模仿ja...原创 2018-08-02 17:07:50 · 5988 阅读 · 1 评论 -
Agent agentmain-运行期恢复类修改,热替换
前文讲过运行期修改类,但是有的时候想去除以前的修改,比如曾经添加了类监控,但是现在不想监控了,希望恢复成原生代码。使用以下代码,重新从源码文件中读取类信息,然后加载到jvm中。这既可以擦除原来的修改,也可以实现热替换功能。 这里只贴出了关键代码,其它部分和前文一致。public class RestoreTransformer implements ClassFileTransformer ...原创 2018-11-22 10:14:26 · 1731 阅读 · 1 评论