4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
ObjectwebASM研究-CodeGenerator_Genekras的专栏-CSDN博客
来自 : CSDN技术社区 发布时间:2021-03-24

ASM就是一个Generator产生器。

 

http://budairenqin.iteye.com/blog/1771141 Java字节码框架asm快速入门

 

 

一般情况下 Class文件是通过javac编译器产生的 然后通过类加载器加载到虚拟机内 再通过执行引擎去执行。现在我们可以通过ASM的API直接生成符合Java虚拟机规范的Class字节流 这样 ASM做的事情一定程度上正是javac解释器做的工作。

 

 

一般asm的应用场景主要在aop上 比如Spring在底层就是用了asm 但asm不仅仅是只能在aop方面发挥它强大的能力 比如你现在要写一个rpc框架 可能会在序列化对象上犯难 使用java的序列化机制 有点慢 json? 比如阿里的大神搞的fastjson性能就很好 ,但我要序列化的对象很简单 没有嵌套对象 不需要深拷贝 并且我并不想按照json的格式来 。

 

 

ASM库提供生成、转换类的2种API 一种API是基于事件 一种是基于树的。基于事件的就类似于xml的SAX 而基于树的就像DOM.这2种API都有各自的有点与缺点。基于事件的API快速并且需要的内存比基于树的少。
 

 

org.objectweb.asm与org.objectweb.asm.signature是定义基于事件的API并提供了class的读写组建。
org.objectweb.asm.util是工具包。
org.objectweb.asm.commons定义了预定义类的转行器
org.objectweb.asm.tree定义了基于树的API
org.objectweb.asm.tree.analysis定义了基于树API的分析框架和预定义类的分析器
 

 

 

     要想驾驭ASM 先要了解一下JAVA的CLASS文件格式。JAVA的CLASS文件通常是树型结构。根节点包含以下元素

ConstantPool 符号表

 

FieldInfo 类中的成员变量信息

 

MethodInfo 类中的方法描述

 

Attribute 可选的附加节点。 

      FieldInfo节点包含成员变量的名称 诸如public,private,static等的标志。

      ConstantValue属性用来存储静态的不变的成员变量的值。

      Deprecated和Synthetic被用来标记一个成员变量是不被推荐的或由编译器生成的。

      MethodInfo节点包含方法的名称 参数的类型和和它的返回值 方法是公有的 私有的或静态的等标志。

      MethodInfo包含可选的附加属性 其中最重要的是Code属性 它包含非抽象的方法的代码。

      Exceptions属性包含方法将抛出的Exception的名称。

      Deprecated和Synthetic属性的信息同上面的FieldInfo的定义一样。

 

      根节点的可选属性有SourceFile InnerClasses和Deprecated。

      SourceFile用来存储被编译成字节码的源代码文件的原始名称;

      InnerClasses存储内部类的信息。由于这些属性的存在 java 的类格式是可以扩展的 也就是说可以在一个class中 附加一些非标准的属性, java虚拟机会忽略这些不可识别的属性 正常的加载这个class。

 

ConstantPool是一个由数字或字符串常量的索引组成的队列 或由此类的树的其他节点引用的 由其他对象创建的被引用常量的索引组成的队列。这个表的目标是为了减少冗余。例如 FieldInfo节点不包含节点的名称 只包含它在这一表中的索引。同样的 GETFIELD和PUTFIELD不直接包含成员变量的名称 只包含名称的索引。

其他

 https://github.com/qmx/jitescript JiteScript基本上仅仅是ASM API的包装。

https://github.com/cglib/cglib 

cglib就是封装了asm 简化了asm的操作 实现了在运行期动态生成新的class。

Byte Code Generation Library is high level API to generate and transform JAVA byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access. https://github.com/cglib/cglib/wiki

本文链接: http://asmresearch.immuno-online.com/view-683721.html

发布于 : 2021-03-24 阅读(0)