`

使用ASM动态创建类

阅读更多

使用ASM动态创建类,可以不需要java源文件,或者在类被JAVA虚拟机装入内存之前,动态修改类。

如下,动态创建一个类Example.class并执行。

ClassWriter cw = new ClassWriter(0);
        cw.visit(V1_5, ACC_PUBLIC, "Example", null, "java/lang/Object", null);

        // creates a MethodWriter for the (implicit) constructor
        MethodVisitor mw = cw.visitMethod(ACC_PUBLIC,
                "<init>",
                "()V",
                null,
                null);
        // pushes the 'this' variable
        mw.visitVarInsn(ALOAD, 0);
        // invokes the super class constructor
        mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        mw.visitInsn(RETURN);
        // this code uses a maximum of one stack element and one local variable
        mw.visitMaxs(1, 1);
        mw.visitEnd();

        // creates a MethodWriter for the 'main' method
        mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
                "main",
                "([Ljava/lang/String;)V",
                null,
                null);
        // pushes the 'out' field (of type PrintStream) of the System class
        mw.visitFieldInsn(GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;");
        // pushes the "Hello World!" String constant
        mw.visitLdcInsn("Hello world!");
        // invokes the 'println' method (defined in the PrintStream class)
        mw.visitMethodInsn(INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println",
                "(Ljava/lang/String;)V");
        mw.visitInsn(RETURN);
        // this code uses a maximum of two stack elements and two local
        // variables
        mw.visitMaxs(2, 2);
        mw.visitEnd();

        // gets the bytecode of the Example class, and loads it dynamically
        byte[] code = cw.toByteArray();

        FileOutputStream fos = new FileOutputStream("d:/com/Example.class");
        fos.write(code);
        fos.close();

        Helloworld loader = new Helloworld();
        Class<?> exampleClass = loader.defineClass("Example",code, 0, code.length);

        // uses the dynamically generated class to print 'Helloworld'
        exampleClass.getMethods()[0].invoke(null, new Object[] { null });

 程序执行,打印“Hello world!”。

使用反编译工具查看CLASS文件,内容如下:

public class Example
{
  public static void main(String[] paramArrayOfString)
  {
    System.out.println("Hello world!");
  }
}

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ASM操作字节码,动态生成Java类class文件

    ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...

    基于JPA及ASM9实现自动接口开发

    实现基于ASM9,动态生成entity、repository、service、serviceImpl、controller相关.class 可根据库表,一键生成新增、修改删除、查询等接口 实现部分基于mybatis-plus,动态代码生成(相关包,未包含) 数据库文件...

    ASM4使用指南 ASM GUIDE

    7. **教程与学习资源**:"ASM4使用指南.pdf"文件应包含了关于如何启动ASM4,创建第一个模型,进行建模操作,运行模拟以及解读分析结果等内容。这份指南是学习和掌握ASM4的关键资源,建议用户按照指南逐步实践。 8. ...

    oracle不使用oracleasm的包配置ASM磁盘配置方法

    ### Oracle 不使用 OracleASM 的包配置 ASM 磁盘配置方法 #### 概述 在 Oracle 数据库系统中,自动存储管理(ASM)是用于管理数据库文件的一种高性能、高可用性的解决方案。通常情况下,ASM 依赖于 Oracle 提供的 ...

    RHEL5下_使用ASM创建Oracle数据库

    在RHEL5操作系统环境下,创建一个使用ASM(Oracle Automatic Storage Management)的Oracle数据库涉及多个步骤。ASM是Oracle数据库的一种存储管理技术,它自动化了磁盘管理和数据存储的复杂性,提供高可用性和性能优化...

    Android-Android无痕埋点框架使用ASM插桩实现

    4. **构建和加载类**: 最后,使用ASM的ClassWriter生成新的字节码,然后通过DexClassLoader或其他类加载器动态加载到Android系统中。 MonitorDemo-master项目很可能包含了一个示例的Android无痕埋点框架实现,包括...

    cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar

    3. **元编程**:ASM库允许开发者在运行时动态创建或修改类,这对于构建元编程框架或字节码级别的调试工具至关重要。 4. **字节码分析**:ASM-Tree提供了对字节码的高级抽象,便于进行代码分析和修改,对于字节码级别...

    ASM维护使用指导手册

    ASM允许动态添加和删除磁盘,以适应存储需求的变化。添加磁盘使用`ALTER DISKGROUP`命令,删除磁盘则使用`DROP DISK`命令。 - **管理ASM磁盘组** 磁盘组是ASM存储的逻辑单位,包含一组磁盘,提供冗余和故障恢复...

    ASM4手册中文版.pdf.zip

    - AOP框架:如Spring AOP,通过ASM动态生成代理类实现切面逻辑。 - 代码混淆:如ProGuard,利用ASM对字节码进行混淆,提高代码安全性。 - 性能监控:通过ASM动态插入监控代码,收集运行时性能数据。 - 运行时代码...

    ASM使用指南-中文版

    ASM是一个强大的Java字节码操控和分析框架,它允许开发者动态生成或修改Java类和运行时的类。这个“ASM使用指南-中文版”提供了全面的教程和参考信息,帮助开发者深入理解并有效地利用ASM库。 ASM的核心功能在于...

    asm 6.0 工具集

    ASM库允许开发者直接操作字节码,创建和修改类,甚至在运行时动态生成类。ASM通过访问者模式设计,使得在字节码级别进行操作变得简洁高效。ASM支持JVM规范的所有版本,包括Java 8及更高版本的特性,如lambda表达式和...

    ASM4.2 DEMO

    1. 动态生成类:ASM允许你在运行时动态创建新的类和接口。这对于实现代码生成器或者运行时类型定制非常有用。例如,你可以创建一个表示数据库记录的动态类,其中包含字段和方法,这些都根据数据库表结构自动生成。 ...

    asm操作指南(中文)

    通过直接生成二进制`.class`文件,ASM能够在类被加载到Java虚拟机之前动态地改变类的行为。 - **应用场景**: - **程序分析**:用于查找应用程序中的潜在错误、检测未使用的代码以及实现代码逆向工程。 - **程序...

    asm的jar包

    4. **示例**:有时,压缩包中还会包含示例代码,演示如何使用ASM来实现某些特定功能,如创建动态代理、修改类或方法的行为等。 5. **构建脚本和配置文件**:如`pom.xml`(如果是Maven项目)或者`build.gradle`...

    logback日志级别动态切换的终极方案(Java ASM使用).doc

    使用ASM动态修改字节码的优势在于,它不仅能够立即改变日志级别,还可以实现基于关键字或其他条件的实时日志过滤,减少IO和磁盘空间的消耗。然而,这种方法需要一定的编程技能,可能不适合所有运维人员自行操作。 ...

    asm4.0全家福

    标题中的“asm4.0全家福”指的是ASM库的一个完整版本集合,ASM是一个Java字节码操控和分析框架,主要用于动态生成类或者增强已有类的功能。这个“全家福”包括了ASM库的主要组件,分别是: 1. **asm-4.0**: 这是ASM...

    cglib和asm

    ASM提供了底层的字节码操作能力,而CGlib则在其上构建了一个更易于使用的API,使得开发者无需直接与ASM的复杂接口打交道,就能实现类的动态扩展和代理。CGlib封装了ASM的一些细节,提供了更高级别的抽象,使得开发者...

    asm + cglib demo

    1. **ASM 示例**: 使用ASM创建一个新的类,或者修改已有的类,例如添加新的字段、方法,或者在已有方法中插入额外的逻辑。 2. **CGlib 示例**: 创建一个代理对象,该代理对象会在目标方法调用前后插入自定义的行为,...

    cglib.jar | asm.jar对应版本

    它主要用来在运行时动态创建子类,以此来实现对目标对象的代理。在Java中,由于无法直接对非接口实现类进行代理(JDK动态代理仅支持接口代理),所以cglib通过继承目标类的方式来创建代理对象。当一个类没有接口或者...

Global site tag (gtag.js) - Google Analytics