一、Type
A Type object represents a Java type
- Type.getType(String.class).getInternalName() :结果是 java/lang/String
- Type.getType(String.class).getDescriptor() :其实就是 Ljava/lang/String;
- Type.INT_TYPE.getDescriptor() :就是类型描述符 I
- Type.getArgumentTypes(“(I)V”) :获取参数类型
- Type.getReturnType(“(I)V”) : 获取返回值类型
二、TraceClassVisitor
TraceClassVisitor能够将java字节码以文本的方式展现出来。
package com.asm.tools;
import org.objectweb.asm.util.TraceClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import java.io.PrintWriter;
/**
* Created by ouer1994 on 2017/2/21.
*/
public class TestTraceClassVisitor {
public static void main(String args[]) {
ClassWriter cw = new ClassWriter(0);
TraceClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out));
cv.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
"test/asm/examples/Comparable", null, "java/lang/Object",
new String[]{"test/asm/examples/Mesurable"});
cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "LESS", "I", null, new Integer(-1)).visitEnd();
cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "EQUAL", "I", null, new Integer(0)).visitEnd();
cv.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "GREATER", "I", null, new Integer(1)).visitEnd();
cv.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo", "(Ljava/lang/Object;)I", null, null).visitEnd();
cv.visitEnd();
}
}
控制台会打印出所创建的类:
// class version 49.0 (49)
// access flags 0x601
public abstract interface test/asm/examples/Comparable implements test/asm/examples/Mesurable {
// access flags 0x19
public final static I LESS = -1
// access flags 0x19
public final static I EQUAL = 0
// access flags 0x19
public final static I GREATER = 1
// access flags 0x401
public abstract compareTo(Ljava/lang/Object;)I
}
三、CheckClassAdapter
—
CheckClassAdapter是为了防止创建非法的类而生的。有校验的功能。如果类或者方法有错误会抛出IllegalStateException 或者 IllegalArgumentException异常。
public static void main(String args[]) {
ClassWriter cw = new ClassWriter(0);
TraceClassVisitor cv = new TraceClassVisitor(cw, new PrintWriter(System.out));
CheckClassAdapter checkClassAdapter = new CheckClassAdapter(cv);
checkClassAdapter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
"test/asm/examples/Comparable", null, "java/lang/Object",
new String[]{"test/asm/examples/Mesurable"});
checkClassAdapter.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "LESS", "I", null, new Integer(-1)).visitEnd();
checkClassAdapter.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "EQUAL", "I", null, new Integer(0)).visitEnd();
checkClassAdapter.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "GREATER", "I", null, new Integer(1)).visitEnd();
checkClassAdapter.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo", "(Ljava/lang/Object;)I", null, null).visitEnd();
checkClassAdapter.visitEnd();
}
四、ASMifier
在终端输入:
java -classpath asm-all-5.2.jar org.objectweb.asm.util.ASMifier java.lang.Runnable
输出:
package asm.java.lang;
import java.util.*;
import org.objectweb.asm.*;
public class RunnableDump implements Opcodes {
public static byte[] dump () throws Exception {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;
AnnotationVisitor av0;
cw.visit(52, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE, "java/lang/Runnable", null, "java/lang/Object", null);
{
av0 = cw.visitAnnotation("Ljava/lang/FunctionalInterface;", true);
av0.visitEnd();
}
{
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "run", "()V", null, null);
mv.visitEnd();
}
cw.visitEnd();
return cw.toByteArray();
}
}