| « | October 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
|
| 统计 |
blog名称: 日志总数:122 评论数量:12 留言数量:0 访问次数:321028 建立时间:2009年1月7日 |
| 
|
本站首页 管理页面 写新日志 退出
[编程]asm学习(1)--什么是asm |
什么是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) | 编辑 | 精华 |
» 1 »
|