设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 软件追踪 查看内容

ASMSupport 0.4版本发布,Java字节码操作

2015-4-7 23:12| 发布者: joejoe0332| 查看: 959| 评论: 0|原作者: oschina|来自: oschina

摘要: ASMSupport 0.4发布,0.4版本主要改变是采用了全新的Dummy方式的API来生成class,比如希望生成如下代码?1234567publicclassFirstCase{publicstaticvoidmain(Stringargs){System.out.println("HelloASMSupport.");}}0 ...

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"nullnull);
 creator.createStaticMethod("main",
  new AClass[]{AClassFactory.getProductClass(String[].class)},
      new String[]{"args"}, nullnull, 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();

除此之外还有如下突破。

新特性

  1. 增加全新Dummy方式API

  2. 采用链式结构作为执行队列

  3. 重构程序块实现

  4. 采用asm 0.5版本

  5. 第三方jar包零依赖

  6. 简化优化接口设计

  7. 获取类或者变量的成员时判断是否有权限访问

已修复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

1
2
3
4
5
<dependency>
    <groupId>cn.wensiqun</groupId>
    <artifactId>asmsupport</artifactId>
    <version>0.4</version>
</dependency>

地址

当使用ASM编写的时候 很多情况下需要了解JVM底层的指令的, 并且需要对栈和本地变量显式的进行操作, 如果直接用ASM进行开发势必会付出更多的学习成本和时间成本,并且不易后期的维护。

此框架正好缓解了上述问题。是程序员编写字节码的时候更易于理解和开发,屏蔽了JVM指令以及栈和本地变量的操作,开发的时候更趋近与直接编写java程序。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部