http://blog.sina.com.cn/jingleq[订阅][手机订阅]
字体大小: 正文
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,不了解字节码是不行的,特别想开发高效的程序。
  到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 });
 

 

auth by :csnowfox

加载中,请稍候...
  • 评论加载中,请稍候...

验证码:请点击后输入验证码  收听验证码

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

相关博文
读取中...
推荐博文
读取中...