字节码操作(ObjectWeb ASM)
2010-11-26 09:12
190 查看
介绍
ObjectWeb ASM轻量级的Java字节码处理框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。
项目主页:http://asm.objectweb.org/
示例代码
ObjectWeb ASM轻量级的Java字节码处理框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。
项目主页:http://asm.objectweb.org/
示例代码
import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class TestAsm implements Opcodes{ public static void main(String[] args) throws Exception{ ClassWriter cw=new ClassWriter(ClassWriter.COMPUTE_MAXS);//这样设置才能自动计算 String className="Example"; cw.visit(V1_5,ACC_PUBLIC,className,null,"java/lang/Object",new String[]{"java/lang/Cloneable",ITest.class.getName().replace('.','/')}); String field="test"; Object defaultValue=123d; String setMd="setTest"; String getMd="getTest"; cw.visitField(ACC_PRIVATE,field,"D",null,null).visitEnd(); MethodVisitor mv=cw.visitMethod(ACC_PUBLIC,getMd,"()D",null,null); mv.visitCode(); mv.visitVarInsn(ALOAD,0); mv.visitFieldInsn(GETFIELD,className,field,"D"); mv.visitInsn(DRETURN); mv.visitMaxs(0,0);// 自动计算局部变量和栈大小 mv.visitEnd(); cw.visitEnd(); mv=cw.visitMethod(ACC_PUBLIC,setMd,"(D)V",null,null); mv.visitCode(); mv.visitVarInsn(ALOAD,0); mv.visitVarInsn(DLOAD,1); mv.visitFieldInsn(PUTFIELD,className,field,"D"); mv.visitInsn(RETURN); mv.visitMaxs(0,0);// 自动计算 mv.visitEnd(); // 下面产生构造方法 mv=cw.visitMethod(ACC_PUBLIC,"<init>","()V",null,null); mv.visitCode(); mv.visitVarInsn(ALOAD,0); mv.visitMethodInsn(INVOKESPECIAL,"java/lang/Object","<init>","()V"); if(defaultValue != null){ //在构造方法中赋默认值 mv.visitVarInsn(ALOAD,0); mv.visitLdcInsn(Double.parseDouble(defaultValue.toString())); mv.visitFieldInsn(PUTFIELD,className,field,"D"); } mv.visitInsn(RETURN); mv.visitMaxs(0,0);// 自动计算 mv.visitEnd(); cw.visitEnd(); byte[] bs=cw.toByteArray(); // FileUtil.writeFile("d:/test/asm/Example.class",bs); MyCLassLoader loader=new MyCLassLoader(); Class c=loader.defineClass(bs); c.getConstructor(new Class[0]); ITest ins=(ITest)c.newInstance(); //ins.setTest(100.0d); System.out.println(ins.getTest()); } public interface ITest{ public double getTest(); public void setTest(double d); } public static class MyCLassLoader extends ClassLoader{ public Class defineClass(byte[] data){ return super.defineClass(null,data,0,data.length,null); } } }
相关文章推荐
- 解决 java.lang.NoSuchMethodError: org.objectweb.asm.org.objectweb.asm.ClassWriter.
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
- Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
- org/objectweb/asm/Type异常解决办法
- MyEclipse 整合 Spring 和 Hibernate时,报 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
- org/objectweb/asm/Type异常解决办法
- java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor的解决方法
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
- Err:NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V解决办法
- java字节码框架ASM操作字节码的方法浅析
- NoSuchMethodErrorrg.objectweb.asm
- heibernate 出现如下错误:java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
- Hibernate 使用JUnit 测试出现java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
- java.lang.NoClassDefFoundError: org/objectweb/asm/Type
- 解决:java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter
- hibernate读取hbm.xml文件报错Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
- Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
- java.lang.NoClassDefFoundError: org/objectweb/asm/Type