你的位置:首页 > 软件开发 > Java > ASM学习笔记

ASM学习笔记

发布时间:2015-03-20 12:01:18
参考:ASM 4 user guide 第一部分 core API第二章 类2.1.1概观编译后的类包括:l 一个描述部分:包括修饰语(比如public或private)、名字、父类、接口或者注释区域。l 类中每个域声明的部分。l 类中每个方法以及构造 ...

参考:ASM 4 user guide

 

第一部分 core API

第二章  类

2.1.1概观

编译后的类包括:

l  一个描述部分:包括修饰语(比如public或private)、名字、父类、接口或者注释区域。

l  类中每个域声明的部分。

l  类中每个方法以及构造函数声明的部分。也包含了方法编译后的代码,它是一系列Java字节码指令的形式。

编译后的类结构如下:

 

2.1.2内部名(internal name)

类或者接口使用内部名,内部名就是类的全限定名,即带斜杠的全称。

      例如,String的internal name为 java/lang/String.

2.1.3类型描述符

内部名只被用在类或者接口名字。其他的使用类型描述符。

 

String is Ljava/lang/String;

类的描述符以L开头,以分号结尾。

数组类型以方括号开头。

 

2.1.4方法描述

 

方法描述符以圆括号开始,圆括号中是每个参数的类型(每个参数类型连着写,之间没有空格或者逗号之类),圆括号后面是方法的返回值类型。 方法描述符不包括方法的名字和参数名字。

 

 

2.2 接口和组件

2.2.1 描述

ASM API对于产生和转换编译后的类是基于ClassVistor抽象类的。visitField返回一个FieldVistor,这个规则在FieldVistor中也是递归的。

ClassVistor中方法调用的顺序:

visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*

( visitInnerClass | visitField | visitMethod )*

visitEnd

visit必须首先调用,接着最多一个visitSource,接着最多一个visitOuterClass, 接着任意数量个visitAnnotation和visitAttribute,接着任意数量个visitInnerClass、visitField和visitMethod,最后调用visitEnd。

 

ASM提供了三种基于ClassVisitor API的核心组件来产生和转换类,

l  ClassReader类解析一个给定的编译好的类的字节数组,调用ClassVisitor实例中的visitXXX方法,这个ClassVistor实例是作为accept的参数传入的。它可以被看做是事件的生产者。

l  ClassWriter类是ClassVistor的子类,它将编译后的类直接以二进制的形式构建。它输出一个包括编译好的类的字节数组(可以通过toByteArray方法获得)。它被看做是事件的消费者。

l  ClassVistor类代理了所有的来自其他ClassVistor实例的方法调用。它被看做是事件的过滤者。

2.2.2 解析类

解析一个现有的类需要的组件只是ClassReader。例子,我们需要打印一个类的内容,首先我们写一个ClassVistor的子类来打印它所访问的类的信息。

ClassPrinter cp = new ClassPrinter();

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:ASM学习笔记

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录