asm学习(1)--什么是asm(2007-05-30 09:14:41)
什么是asm呢?asm是assembly的缩写,是汇编的称号,对于java而言,asm就是字节码级别的编程。
而这里说到的asm是指objectweb
asm,一种.class的代码生成器的开源项目。ASM是一套java字节码生成架构,它可以动态生成二进制格式的stub类或其它代理类,或者在类被java虚拟机装入内存之前,动态修改类。现在挺多流行的框架都使用到了asm.所以从aop追溯来到了这。
想学习asm,不了解字节码是不行的,特别想开发高效的程序。
其中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 });
auth by :csnowfox
加载中,请稍候...