美文网首页ASM 字节码框架源码解析
使用ASM 框架为类动态增加属性

使用ASM 框架为类动态增加属性

作者: Xcdf | 来源:发表于2019-02-06 22:02 被阅读6次

  有一个测试类Demo.class,现在需要给这个类增加一个属性private String name

public class Demo{
}

  增加属性的方式:

package test;

import org.objectweb.asm.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import static org.objectweb.asm.Opcodes.ASM5;


public class AddField extends ClassVisitor {

    private String name;
    private int access;
    private String desc;
    private Object value;

    private boolean duplicate;

    // 构造器
    public AddField(ClassVisitor cv, String name, int access, String desc, Object value) {
        super(ASM5, cv);
        this.name = name;
        this.access = access;
        this.desc = desc;
        this.value = value;
    }

    @Override
    public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
        if (this.name.equals(name)) {
            duplicate = true;
        }
        return super.visitField(access, name, desc, signature, value);
    }

    @Override
    public void visitEnd() {
        if (!duplicate) {
            FieldVisitor fv = super.visitField(access, name, desc, null, value);
            if (fv != null) {
                fv.visitEnd();
            }
        }
        super.visitEnd();
    }

    public static void main(String[] args) throws Exception {
        String classDir="/Users/xule05/test/testasm/src/main/java/test/Demo.class";
        String output = "/Users/xule05/test/testasm/src/main/java/test/";
        ClassReader classReader = new ClassReader(new FileInputStream(classDir));
        ClassWriter classWriter = new ClassWriter(classReader, ClassWriter.COMPUTE_MAXS);
        ClassVisitor addField = new AddField(classWriter,
                "field",
                Opcodes.ACC_PRIVATE ,
                Type.getDescriptor(String.class),
                "demo"
        );
        classReader.accept(addField, ClassReader.EXPAND_FRAMES);
        byte[] newClass = classWriter.toByteArray();
        File newFile = new File(output, "NewDemo.class");
        new FileOutputStream(newFile).write(newClass);
    }
}

  上述给类增加属性的代码是一般的格式,并且在ASM的其他包中都有类似的代码,来源于一个通用的模板。
  输出的类反编译的结果如下:


Demo.class

  ASM 非常容易的实现了为已知的类增加新的属性。增加方法或者代码块等都是类似的。

相关文章

  • 使用ASM 框架为类动态增加属性

      有一个测试类Demo.class,现在需要给这个类增加一个属性private String name。   增...

  • 使用ASM为一个类增加属性

    使用ASM为一个类增加属性 使用ASM可以方便的访问和修改一个类,或者在JVM载入前动态更新一个类也是可以的,如下...

  • iOS中的runtime理解

    Runtime的使用:1.动态获取/创建类2.动态为一个类增加属性(关联对象)或方法3.在程序运行过程中遍历类中的...

  • JAVA中ASM是什么?

    什么是 ASM ? ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可...

  • 深入开源框架底层之ASM

    什么是 ASM ? ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可...

  • 浅谈Java代理二:Cglib动态代理-MethodInterc

    CGLib动态代理特点:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM...

  • 简单看看ASM框架

    什么是ASM ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接...

  • 43 AOP(面向切面编程)-ASM-2

    1. ASM 介绍 ASM 是一个 Java 字节码操作框架,它能用来动态生成类或者增强既有类的功能。ASM 可以...

  • Cglib和jdk动态代理

    Cglib和jdk动态代理说到cglib技术,使用的就是增强类Enhancer,底层使用的ASM技术.下面举例说明...

  • 动态添加属性

    动态添加属性:什么时候需要动态添加属性? 开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方...

网友评论

    本文标题:使用ASM 框架为类动态增加属性

    本文链接:https://www.haomeiwen.com/subject/pfgisqtx.html