ASMSupport 0.4发布,0.4版本主要改变是采用了全新的Dummy方式的API来生成class,比如希望生成如下代码 1 2 3 4 5 6 7 | public class FirstCase {
public static void main(String[] args) {
System.out.println( "Hello ASMSupport." );
}
}
|
0.3以前版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC , "FirstCase" , null , null );
creator.createStaticMethod( "main" ,
new AClass[]{AClassFactory.getProductClass(String[]. class )},
new String[]{ "args" }, null , null , Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
new StaticMethodBody(){
@Override
publicvoid generateBody(LocalVariable... argus) {
invoke(systemOut, "println" , Value.value( "Hello ASMSupport." ));
runReturn();
}
});
Class FirstCaseClass = creator.startup()
|
新版本 1 2 3 4 5 6 7 8 9 | DummyClass dummy = new DummyClass( "FirstCase" ).public_()
.newMethod( "main" ).public_().static_().argTypes(String[]. class )
.body( new MethodBody(){
public void body(LocalVariable... args) {
call(defType(System. class ).field( "out" ), "println" , val( "Hello ASMSupport." ))
return_();
}
});
Class<?> FirstCaseClass = dummy.build();
|
除此之外还有如下突破。 新特性增加全新Dummy方式API 采用链式结构作为执行队列 重构程序块实现 采用asm 0.5版本 第三方jar包零依赖 简化优化接口设计 获取类或者变量的成员时判断是否有权限访问
已修复Bug1 . catch块中重复的异常名“e” 2 . 生成调用构造方法的字节码时,传递的参数列表和和实际参数列表不同,但仍能创建成功 3 . 生成变元方法的调用,并且传入空参数抛下标越界 4 . AClass的isChildOrEqual方法异常(接口不是Object子类) 5 . 重写父类方法,但是设置其返回类型为被重写方法的返回类型的子类型 6 . 新创建的方法中无法调用重写方法 7 . 无法生成获取父类属性的字节码 8 . 创建的枚举类型缺少常量ENUM$VALUES 9 . 创建的枚举类缺少values方法和valueOf方法 源码包结构 asmsupport
|-src/main/java
|-java : Maven standard source
|-.../asmsupport
|-standard : ASMSupport实现标准API
|-client : ASMSupport权限Dummy实现
|-core : ASMSupport核心实现
|-resource : Maven standard source resources
|-src/test
|-java : Maven standard test
|-resource : Maven standard test resources
|-src/third/java : ASMSupport依赖的第三方包源码(作为maven编译的源码包)
|-src/issue/java : ASMSupport修复bug的测试用例(作为maven编译的测试包)
|-src/sample/java : ASMSupport样例.(作为maven编译的测试包)
|-oldApi : 使用老版api的实例.
|-dummy : 使用dummy api的实例
|-json : 使用dummy api实现的一个简单的json序列化实例
|-proxy : 使用dummy api实现的一个简单动态代理实例。
|-src/site : 项目文档目录. 如果希望将项目导入eclipse,至少需要手动设置src/third/java为源码目录。为了方便入手和学习,在src/sample/java下还提供了简单的实例:比如实现字节码实现的json序列化工具,字节码实现的动态代理工具,分别运行json/demo/Runner.java和proxy/demo/Runner.java类测试这两个工具。 Maven 1 2 3 4 5 | < dependency >
< groupId >cn.wensiqun</ groupId >
< artifactId >asmsupport</ artifactId >
< version >0.4</ version >
</ dependency >
|
地址 当使用ASM编写的时候 很多情况下需要了解JVM底层的指令的, 并且需要对栈和本地变量显式的进行操作, 如果直接用ASM进行开发势必会付出更多的学习成本和时间成本,并且不易后期的维护。 此框架正好缓解了上述问题。是程序员编写字节码的时候更易于理解和开发,屏蔽了JVM指令以及栈和本地变量的操作,开发的时候更趋近与直接编写java程序。 |