ASMSupport 0.4发布,0.4版本主要改变是采用了全新的Dummy方式的API来生成class,比如希望生成如下代码 public class FirstCase { public static void main(String[] args) { System.out.println("Hello ASMSupport."); } } 0.3以前版本 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() 新版本 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包零依赖 简化优化接口设计 获取类或者变量的成员时判断是否有权限访问 已修复Bug 1 . 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 <dependency> <groupId>cn.wensiqun</groupId> <artifactId>asmsupport</artifactId> <version>0.4</version> </dependency> 地址 git@osc github 文档首页 osc项目首页 jar下载 当使用ASM编写的时候 很多情况下需要了解JVM底层的指令的, 并且需要对栈和本地变量显式的进行操作, 如果直接用ASM进行开发势必会付出更多的学习成本和时间成本,并且不易后期的维护。 此框架正好缓解了上述问题。是程序员编写字节码的时候更易于理解和开发,屏蔽了JVM指令以及栈和本地变量的操作,开发的时候更趋近与直接编写java程序。 ASMSupport 0.4 版本发布,Java 字节码操作下载地址