当前目录下的教程使用的是基于asmsupport-client,相比于asmsupport-core。asmsupport-client的教程更容易使用。asmsupport-client是对asmsupport-core的高一层封装,所以对于希望学习源码建议直接从asmsupport-core入手
在这个部分内容中,我们将介绍如何使用asmsupport-client来创建各种操作以及class。首先会介绍一下java中的基本操作在asmsupport-client中如何实现(在这个过程中会简单的使用asmsupport-client创建一个类来支持这些操作),然后再介绍如何创建一个class,方法,属性,最后再介绍如何创建各种程序块。在介绍这些之前,先来了解下asmsupport的一些基本类型。
ArrayClass是ASMSupport对java中数组类型的一个封装,比如int[], String[][]。 对应的在ArrayClass中我们也需要保存数组的相关的信息,比如数组的维度,数组的基本类型等等
这个类主要是用来表示已经存在的class,也就说已经存在于虚拟机中的class,比如java.lang.String或者我们随便创建的某个class,在asmsupport中都将抽象成ProductClass,我们称之为成品类
这个接口定义了基本数据类型的值,通常可以理解为允许进入常量池的值。比如基本类型,boolean,true. 数字类型1,2,2.1 等等,除了基本类型还有字符串类型的值以及Class对象。
Asmsupport的总体思想就是,尽可能的还原真实代码的结构。所以在asmsupport中将会大量使用匿名类的方式。比如下面的代码:
new MethodBody() {
public void body(LocVar... args) {//方法开始
//位置1
if_(new IF(condition){
public void body(){//if块开始
//位置2
LocVar name = var("name", String.class, val("asmsupport"))
}//if块结束
}).elseif(new Else(){
public void body(){//else块开始
//位置3
}//else块开始
})
}//方法体结束
};
上面的代码正好对应于java代码
public void test(){
//位置1
if(condition) {//if开始
//位置2
String name = "asmsupport";
} else {//else 开始
//位置3
}
}
使用这种方式还有一个原因。在使用asm的时候整个局部变量对开发者是开放的,那么程序可以在任意时刻访问任意位置的局部变量,比如在上面代码中的位置3获取位置2定义的变量name。采用这种方式就避免了这种问题。