本站首页    管理页面    写新日志    退出

[编程]asm学习(1)--什么是asm
seanno13 发表于 2009/1/13 10:31:57

什么是asm呢?asm是assembly的缩写,是汇编的称号,对于java而言,asm就是字节码级别的编程。   而这里说到的asm是指objectweb asm,一种.class的代码生成器的开源项目。ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类,或者在类被java虚拟机装入内存之前,动态修改类。现在挺多流行的框架都使用到了asm.所以从aop追溯来到了这。   想学习asm,不了解字节码是不行的,特别想开发高效的程序。   到asm的官方网站下载asm发布版,http://asm.objectweb.org/   其中3.0版提供了一个HelloWorld的例子。刚下下来看,稍改动变出错,自己水平太弱了。   现在还好看懂了不少。真的只是helloWorld,实现的只是打印出helloworld的功能。我做了改动,把println去掉了,使程序更易懂。   // 使用ClassWriter来构建  ClassWriter cw = new ClassWriter(0);   // 首先当然先得给出类的信息,参数分别为 .class版本,访问控制,类名,签名(一般为null就行),父类,接口  cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);   // 创建构造函数  MethodVisitor mw = cw.visitMethod(ACC_PUBLIC,"<init>","()V",null,null);  // 取出栈中的变量即this  mw.visitVarInsn(ALOAD, 0);  // 执行父类的构造函数  mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");  mw.visitInsn(RETURN);  // 定议了这个visiter使用了1大小的stack和1个变量   mw.visitMaxs(1, 1);  mw.visitEnd();     //我加进去的,是定议了一个public int型叫number的属性   FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_STATIC, "number", "I", null, 0);  fv.visitEnd();     // 创建main方法  mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main",    "([Ljava/lang/String;)V", null, null);   // 空方法,不执行什么马上返回   mw.visitInsn(RETURN);  // this code uses a maximum of two stack elements and two local  // variables  mw.visitMaxs(1, 1);  mw.visitEnd();     byte[] code = cw.toByteArray();   //把编译好的.class文件放到他对应的包里面  File dir = new File("bin");  if (!dir.exists() || !dir.isDirectory()) {   dir.mkdir();  }  File packDir = new File("bin/asm");  if (!packDir.exists() || !packDir.isDirectory()) {   packDir.mkdir();  }   //写.class   FileOutputStream fos = new FileOutputStream("bin/asm/A.class");  fos.write(code);  fos.close();   //执行,Permissions就是这个类,extends ClassLoader implements Opcodes   HelloWorld loader = new HelloWorld();  Class exampleClass = loader.defineClass("asm.A", code, 0, code.length);  exampleClass.getMethods()[0].invoke(null, new Object[] { null });   

阅读全文(4069) | 回复(1) | 编辑 | 精华

回复:asm学习(1)--什么是asm
hjx_221发表评论于2009/1/14 9:31:37

谢谢!!学习之中....

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.029 second(s), page refreshed 144868799 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号