ASMSupport

ASMSupport【ASMSupport】asmsupport实在asm的基础上做的一封装,使用asmsupport将最大限度的降低位元组码操作的成本,禁止了使用asm的时候对堆叠操作,以及原生的位元组码指令 。
基本介绍中文名:ASM支持类库
外文名:ASMSupport
最新版本:0.4
描述:一个java位元组码操作类库
概述同时增加了更多的灵活性,採用匿名类的方式使方法块更清晰 。ASM&ASMSupport对比这里我们简单的使用asm和asmsupport来生成如下代码:Java源public class Test {    public static void main(String name) {        System.out.println("Hello : " + name);    }}ASM代码1.  ClassWriter mv = cw.visitMethod(Opcodes.ACCpublic_ + Opcodes.ACC_STATIC, "main", "(Ljava/lang/String;)V", null, null);2.  mv.visitCode();3.  Label l0 = new Label();4.  mv.visitLabel(l0);5.  mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");6.  mv.visitTypeInsn(NEW, "java/lang/StringBuilder");7.  mv.visitInsn(DUP);8.  mv.visitLdcInsn("Hello : ");9.  mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);10. mv.visitVarInsn(ALOAD, 0);11. mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);12. mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);13. mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);14. Label l1 = new Label();15. mv.visitLabel(l1);16. mv.visitInsn(RETURN);17. Label l2 = new Label();18. mv.visitLabel(l2);19. mv.visitLocalVariable("name", "Ljava/lang/String;", null, l0, l2, 0);20. mv.visitMaxs(4, 1);21. mv.visitEnd();22. cw.visitEnd();23. byte[] classBytes = cw.toByteArray()从上面可以看到我们想要创建一个class不仅需要使用複杂的位元组码指令(比如第5,6,9…行),而且还要关注堆叠操作(比如第10行就是从局部变数中获取第0个位置,就是方法的参数name),同时在最后需要确定好方法所需要的堆叠数目(第20行) 。对一些隐式的方法位元组码还需特殊处理,比如第6~12行的代码对应的就是(“Hello : ” + name),但实际根据位元组码生成的内容实际是调用了new StringBuilder(“Hello : ”).append(name).toString().这样就大大的增加了开发难度 。ASMSupport代码DummyClass dc = new DummyClass().public_().name("TestCommon").setClassOutPutPath(".//target//dummy-generated");dc.newMethod("main").public_().static_()  .argTypes(String.class).argNames_("name")  .body_(new MethodBody(){    @Override    public void body(LocalVariable... args) {        call_(defType(System.class).field("out"), "println", stradd(val("Hello : "), args[0]));        return_();    }  });Class cls = dc.build();资源maven坐标:    <dependency>        <groupId>cn.wensiqun</groupId>        <artifactId>asmsupport</artifactId>        <version>0.4</version>    </dependency>