我们知道Java是静态语言,而python、ruby是动态语言,Java程序一旦写好很难在运行时更改类的行为,而python、ruby可以。
不过基于bytecode层面上我们可以做一些手脚,来使Java程序多一些灵活性和Magic,ASM就是这样一个应用广泛的开源库。
ASMisaJavabytecodemanipulationframework.Itcanbeusedtodynamicallygeneratestubclassesorotherproxyclasses,
directlyinbinaryform,ortodynamicallymodifyclassesatloadtime,i.e.,justbeforetheyareloadedintotheJavaVirtualMachine.
ASM完成了BCEL和SERP同样的功能,但ASM
只有30多k,而后两者分别是350k和150k。apache真是越来越过气了。
让我们来看一个ASM的简单例子Helloworld.java,它生成一个Example类和一个main方法,main方法打印"Helloworld!"语句:
Java代码
1.importjava.io.FileOutputStream;
2.importjava.io.PrintStream;
3.importorg.objectweb.asm.ClassWriter;
4.importorg.objectweb.asm.MethodVisitor;
5.importorg.objectweb.asm.Opcodes;
6.importorg.objectweb.asm.Type;
7.importorg.objectweb.asm.commons.GeneratorAdapter;
8.importorg.objectweb.asm.commons.Method;
9.
10.publicclassHelloworldextendsClassLoaderimplementsOpcodes{
11.
12.public staticvoid main(finalStringargs[])throwsException{
13.
14.//createsaClassWriterfortheExamplepublicclass,
15.//whichinheritsfromObject
16.
17.ClassWriter cw = newClassWriter(0);
18.cw.visit(V1_1,ACC_PUBLIC,"Example",null,"java/lang/Object",null);
19.MethodVisitormw=cw.visitMethod(ACC_PUBLIC,"<init>","()V",null,
20.null);
21.mw.visitVarInsn(ALOAD,0);
22.mw.visitMethodInsn(INVOKESPECIAL,"java/lang/Object","<init>","()V");
23.mw.visitInsn(RETURN);
24.mw.visitMaxs(1,1);
25.mw.visitEnd();
26.mw=cw.visitMethod(ACC_PUBLIC+ACC_STATIC,"main",
27."([Ljava/lang/String;)V",null,null);
28.mw.visitFieldInsn(GETSTATIC,"java/lang/System","out",
29."Ljava/io/PrintStream;");
30.mw.visitLdcInsn("Helloworld!");
31.mw.visitMethodInsn(INVOKEVIRTUAL,"java/io/PrintStream","println",
32."(Ljava/lang/String;)V");
33.mw.visitInsn(RETURN);
34.mw.visitMaxs(2,2);
35.mw.visitEnd();
36.byte[]code=cw.toByteArray();
37.FileOutputStreamfos=newFileOutputStream("Example.class");
38.fos.write(code);
39.fos.close();
40.Helloworldloader=newHelloworld();
41.ClassexampleClass=loader
42..defineClass("Example",code,0,code.length);
43.exampleClass.getMethods()[0].invoke(null,newObject[]{null});
44.//------------------------------------------------------------------------
45.//SameexamplewithaGeneratorAdapter(moreconvenientbutslower)
46.//------------------------------------------------------------------------
47.
48.cw=newClassWriter(ClassWriter.COMPUTE_MAXS);
49.cw.visit(V1_1,ACC_PUBLIC,"Example",null,"java/lang/Object",null);
50.Methodm=Method.getMethod("void<init>()");
51.GeneratorAdaptermg=newGeneratorAdapter(ACC_PUBLIC,m,null,null,
52.cw);
53.mg.loadThis();
54.mg.invokeConstructor(Type.getType(Object.class),m);
55.mg.returnValue();
56.mg.endMethod();
57.m=Method.getMethod("voidmain(String[])");
58.mg=newGeneratorAdapter(ACC_PUBLIC+ACC_STATIC,m,null,null,cw);
59.mg.getStatic(Type.getType(System.class),"out",Type
60..getType(PrintStream.class));
61.mg.push("Helloworld!");
62.mg.invokeVirtual(Type.getType(PrintStream.class),Method
63..getMethod("voidprintln(String)"));
64.mg.returnValue();
65.mg.endMethod();
66.cw.visitEnd();
67.code=cw.toByteArray();
68.loader=newHelloworld();
69.exampleClass=loader.defineClass("Example",code,0,code.length);
70.exampleClass.getMethods()[0].invoke(null,newObject[]{null});
71.}
72.}
我们看到上面的例子分别使用ASM的MethodVisitor和GeneratorAdapter两种方式来动态生成Example类并调用打印语句。
相关推荐
`learn-java-asm-main.zip` 文件很可能是包含一个示例项目,用来演示如何使用 ASM。通过阅读和运行这个示例,你将能更好地理解 ASM 的实际应用。这个项目可能包含了示例类、测试代码以及解释如何使用 ASM 的文档。在...
《MyPerf4J-ASM-3.2.0:高效Java性能监控与统计利器》 在现代的互联网环境中,高并发、低延迟的应用程序已经成为业界的常态。为了确保这样的系统能够持续稳定运行并保持最佳性能,性能监控和统计工具的重要性...
Java ASM 是一个强大的Java字节码操控和分析框架,它可以直接用来动态生成类或者增强已有类的功能。ASM库被广泛用于构建工具,如Java代理、AOP(面向切面编程)框架、字节码生成器以及性能分析工具等。在这个“java-...
5. "test-asm-premain" - 提到了“premain”,这在Java代理机制中是一个特殊的入口点,当JVM启动时,用于在类加载前插入自定义代码,可能是ASM库的一个使用示例。 综合以上信息,这个压缩包提供了一个学习和实践ASM...
ASM 4 使用指南中文版。ASM是Java字节码的工业级库。长期以来一直没有中文版。这下好了,中文版横空出世。感兴趣的同学可以投递简历 mars # oneapm . com 常年有效 ASM 4.0 A Java bytecode engineering library
asm-1.3.3.jar, asm-1.3.4.jar, asm-1.3.5.jar, asm-1.4.1.jar, asm-1.4.2.jar, asm-1.4.3.jar, asm-1.4.jar, asm-1.5.1.jar, asm-1.5.2.jar, asm-1.5.3.jar, asm-2.0.jar, asm-2.1.jar, asm-2.2.1-sources.jar, asm...
而"spring-asm-3.0.6.release.jar.zip"这个压缩包,包含了Spring框架中一个重要的组件——ASM库。ASM是一个字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。在这里,ASM主要用于Spring的AOP(面向...
java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 包封装。能够让JAR包里面的文件依赖于统一版本的...
将spring源码导入eclipse工程可能会缺少的jar包;学java的应该知道jar包,学spring的应该知道要熟悉spring的源码,本人是根据《spring源码...asm-repack-5.0.4.jar这个包,所以特意上传,给后面一样趟水的人一点帮助。
在本案例中,标题和描述提到的"Spring源码导入Eclipse缺失Jar包spring-asm-repack-5.0.4+spring-cglib-repack-3.1",意味着在进行Spring源码研究时,Eclipse缺少了这两个关键的库文件。 首先,我们需要了解ASM...
【MyPerf4J-ASM-3.3.0】是一款专为JVM(Java Virtual Machine)设计的高性能、无侵入性的性能监控工具。它主要用于帮助开发者在开发过程中实时监控应用的性能指标,以便及时发现和优化潜在的性能瓶颈。这款工具的...
【深入字节码 -- ASM 关键接口 ClassVisitor1】这篇技术文章主要探讨了ASM库在处理Java字节码时的核心接口ClassVisitor及其相关方法。ASM是一个强大的Java字节码操控和分析框架,常用于动态代理、字节码增强以及AOP...
标题中提到的"3.2版本Spring源码需要源码所需要的jar:spring-asm-repack-5.0.4.jar, spring-cglib-repack-3.1.jar",这两部分是Spring源码构建过程中不可或缺的依赖。Spring-asm-repack和Spring-cglib-repack是...
【标题】"cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar" 提供的是一组用于Java编程的库,它们主要用于实现动态代理和字节码操作。 【描述】"cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-...
ASM是一个强大的Java字节码操控和分析...asm-2.2.3.jar、asm-commons-2.2.3.jar和asm-util-2.2.3.jar这三部分构成了ASM 2.2.3版本的主要组件,分别提供了核心功能、常用工具和辅助类,以满足不同层次的字节码操作需求。
在ASM的树API中,asm-tree.jar和asm-analysis.jar主要负责将字节码表示为抽象语法树(AST)的形式,使得对代码的结构化操作变得更加方便。Tree API通常在需要更高级别的抽象来处理类结构时使用,比如进行复杂的代码...
1. ASM-2.2.3.jar:这是ASM的核心库,提供了对Java字节码的低级别访问和修改能力。它允许开发者生成和分析类和方法的字节码,从而实现诸如动态代理、代码混淆、性能优化等功能。 2. asm-commons-2.2.3.jar:这个...
ASM是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。在ASM中,`FieldVisitor`是一个关键的抽象类,它用于访问和修改类中的字段(field)信息。当我们使用ASM来分析或生成类文件时,会...
赠送jar包:asm-all-5.0.2.jar; 赠送原API文档:asm-all-5.0.2-javadoc.jar; 赠送源代码:asm-all-5.0.2-sources.jar; 赠送Maven依赖信息文件:asm-all-5.0.2.pom; 包含翻译后的API文档:asm-all-5.0.2-javadoc-...