`

Java-ASM

阅读更多

我们知道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类并调用打印语句。

 

 

  • asm.rar (17.2 KB)
  • 下载次数: 1
分享到:
评论

相关推荐

    Java ASM,learn-java-asm-main.zip

    `learn-java-asm-main.zip` 文件很可能是包含一个示例项目,用来演示如何使用 ASM。通过阅读和运行这个示例,你将能更好地理解 ASM 的实际应用。这个项目可能包含了示例类、测试代码以及解释如何使用 ASM 的文档。在...

    MyPerf4J-ASM-3.2.0.zip

    《MyPerf4J-ASM-3.2.0:高效Java性能监控与统计利器》 在现代的互联网环境中,高并发、低延迟的应用程序已经成为业界的常态。为了确保这样的系统能够持续稳定运行并保持最佳性能,性能监控和统计工具的重要性...

    java-asm:java asm原始解析

    Java ASM 是一个强大的Java字节码操控和分析框架,它可以直接用来动态生成类或者增强已有类的功能。ASM库被广泛用于构建工具,如Java代理、AOP(面向切面编程)框架、字节码生成器以及性能分析工具等。在这个“java-...

    test-asm.zip

    5. "test-asm-premain" - 提到了“premain”,这在Java代理机制中是一个特殊的入口点,当JVM启动时,用于在类加载前插入自定义代码,可能是ASM库的一个使用示例。 综合以上信息,这个压缩包提供了一个学习和实践ASM...

    ASM4使用指南 - ASM 4 Guide 中文版

    ASM 4 使用指南中文版。ASM是Java字节码的工业级库。长期以来一直没有中文版。这下好了,中文版横空出世。感兴趣的同学可以投递简历 mars # oneapm . com 常年有效 ASM 4.0 A Java bytecode engineering library

    asm.jar各个版本

    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-3.0.6.release.jar.zip"这个压缩包,包含了Spring框架中一个重要的组件——ASM库。ASM是一个字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。在这里,ASM主要用于Spring的AOP(面向...

    spring-asm-3.0.5.RELEASE.jar.zip

    java jar包,亲测试可用 安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 包封装。能够让JAR包里面的文件依赖于统一版本的...

    spring-asm-repack-5.0.4.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缺失Jar包spring-asm-repack-5.0.4+spring-cglib-repack-3.1",意味着在进行Spring源码研究时,Eclipse缺少了这两个关键的库文件。 首先,我们需要了解ASM...

    MyPerf4J-ASM-3.3.0

    【MyPerf4J-ASM-3.3.0】是一款专为JVM(Java Virtual Machine)设计的高性能、无侵入性的性能监控工具。它主要用于帮助开发者在开发过程中实时监控应用的性能指标,以便及时发现和优化潜在的性能瓶颈。这款工具的...

    深入字节码 -- ASM 关键接口 ClassVisitor1

    【深入字节码 -- 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

    标题中提到的"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

    【标题】"cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar" 提供的是一组用于Java编程的库,它们主要用于实现动态代理和字节码操作。 【描述】"cglib动态代理模式jar包 cglib-2.2.jar asm-tree.jar asm-...

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar

    ASM是一个强大的Java字节码操控和分析...asm-2.2.3.jar、asm-commons-2.2.3.jar和asm-util-2.2.3.jar这三部分构成了ASM 2.2.3版本的主要组件,分别提供了核心功能、常用工具和辅助类,以满足不同层次的字节码操作需求。

    02 - ASM组成部分 - 简书1

    在ASM的树API中,asm-tree.jar和asm-analysis.jar主要负责将字节码表示为抽象语法树(AST)的形式,使得对代码的结构化操作变得更加方便。Tree API通常在需要更高级别的抽象来处理类结构时使用,比如进行复杂的代码...

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar,cglib-nodep-2.1_3.jar

    1. ASM-2.2.3.jar:这是ASM的核心库,提供了对Java字节码的低级别访问和修改能力。它允许开发者生成和分析类和方法的字节码,从而实现诸如动态代理、代码混淆、性能优化等功能。 2. asm-commons-2.2.3.jar:这个...

    11 - ASM之FieldVisitor - 简书1

    ASM是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。在ASM中,`FieldVisitor`是一个关键的抽象类,它用于访问和修改类中的字段(field)信息。当我们使用ASM来分析或生成类文件时,会...

    asm-all-5.0.2-API文档-中文版.zip

    赠送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-...

Global site tag (gtag.js) - Google Analytics