|
| 1 | +package base.bytecode; |
| 2 | + |
| 3 | +import org.objectweb.asm.ClassWriter; |
| 4 | +import org.objectweb.asm.MethodVisitor; |
| 5 | +import org.objectweb.asm.Opcodes; |
| 6 | + |
| 7 | +import java.io.File; |
| 8 | +import java.io.FileOutputStream; |
| 9 | +import java.io.IOException; |
| 10 | + |
| 11 | +/** |
| 12 | + * @author zhangluping on 2018/8/21. |
| 13 | + */ |
| 14 | +public class ASMCodeGenerator { |
| 15 | + public static void main(String[] args) throws IOException { |
| 16 | + |
| 17 | + System.out.println(); |
| 18 | + ClassWriter classWriter = new ClassWriter(0); |
| 19 | + // 通过visit方法确定类的头部信息 |
| 20 | + classWriter.visit(Opcodes.V1_7,// java版本 |
| 21 | + Opcodes.ACC_PUBLIC,// 类修饰符 |
| 22 | + "ASMProgrammer", // 类的全限定名 |
| 23 | + null, "java/lang/Object", null); |
| 24 | + |
| 25 | + //创建构造函数 |
| 26 | + MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); |
| 27 | + mv.visitCode(); |
| 28 | + mv.visitVarInsn(Opcodes.ALOAD, 0); |
| 29 | + mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); |
| 30 | + mv.visitInsn(Opcodes.RETURN); |
| 31 | + mv.visitMaxs(1, 1); |
| 32 | + mv.visitEnd(); |
| 33 | + |
| 34 | + // 定义code方法 |
| 35 | + MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "code", "()V", |
| 36 | + null, null); |
| 37 | + methodVisitor.visitCode(); |
| 38 | + methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", |
| 39 | + "Ljava/io/PrintStream;"); |
| 40 | + methodVisitor.visitLdcInsn("I'm a Programmer,Just Coding....."); |
| 41 | + methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", |
| 42 | + "(Ljava/lang/String;)V"); |
| 43 | + methodVisitor.visitInsn(Opcodes.RETURN); |
| 44 | + methodVisitor.visitMaxs(2, 2); |
| 45 | + methodVisitor.visitEnd(); |
| 46 | + classWriter.visitEnd(); |
| 47 | + // 使classWriter类已经完成 |
| 48 | + // 将classWriter转换成字节数组写到文件里面去 |
| 49 | + byte[] data = classWriter.toByteArray(); |
| 50 | + File file = new File("d://ASMProgrammer.class"); |
| 51 | + FileOutputStream fout = new FileOutputStream(file); |
| 52 | + fout.write(data); |
| 53 | + fout.close(); |
| 54 | + } |
| 55 | +} |
0 commit comments