天天看点

asm动态生成字节码

  asm可以直接产生class文件,可以动态的改变类的行为。

  下面是一个简单的示例:产生一个class文件

package com.study.asm;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;


/**
 * 通过asm动态生成Employee类的字节码文件
 * @author Administrator
 *
 */
public class GeneratorEmpClass {

	public static void main(String[] args) throws IOException {
		
		//ClassWriter用于生成类
		ClassWriter writer = new ClassWriter(0);
		
		//通过visit生成类的头部信息
		writer.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, "com/study/Emp", null, null, null);
		
		//定义类Employee的属性 no和age
		writer.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC, "no",  "I", null, new Integer(1)).visitEnd();
		//属性age:private static final age=8
		writer.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC, "age", "I",  null, new Integer(8)).visitEnd();
		
		//定义类的方法
		writer.visitMethod(Opcodes.ACC_PUBLIC, "test","(Ljava/lang/String;)V" , null, null).visitEnd();
		
		//完成
		writer.visitEnd();
		
		//将writer字节数组写到文件里面去
		byte[] byArr = writer.toByteArray();
		File file = new File("D://Emp.class");
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(byArr);
		fos.close();
	}

}
           

通过反编译,可以看到如下结果:

asm动态生成字节码
asm

继续阅读