Core API之Class工具类

    除了ClassVisitor接口和ClassReader、ClassAdapter、ClassWriter之外,ASM提供了org.objectweb.asm.util包。这些工具在开发class生成器和适配器中非常有用。

Type

    当它们已编译过的class存储时,ASM api暴露了java类型:internal name或type 描述。Type对象代表了一个Java类型,可以从type description或Class Object来构建。Type类也包含了代表了基本类型的静态变量,如Type.INT_TYPE对应Int。
    getIntername()方法返回一个type的internal name,如Type.getType(String.class).getInternalName()返回String类的internal name,"java/lang/String"。

    getDescriptor()方法返回一个Type的描述,Type.getType(String.class).getDescriptor(),"Ljava/lang/String"。Type类也提供了静态方法来获取Type对象对应的参数类型和返类型,Type.getArgumentTypes("(I)V")返回一个包含单个元素类型(TYPE.INT_TYPE)数组。Type.getReturnType("(I)V")返回Type.VOID_TYPE对象。

TraceClassVisitor 

    为了检查生成的或转换的class是否符合我们预期,ClassWriter返回的字节数组不起任何作用,因为不可读。TraceClassVisitor提供了文本展现。

ClassWriter cw = new ClassWriter(0);
TraceClassVisitor cv = new TraceClassVisitor(cw, printWriter);
cv.visit(...);
...
cv.visitEnd();
byte b[] = cw.toByteArray();

CheckClassAdapter

    ClassWriter不会检查它的方法以合适的顺序和有效的参数调用。因此可能申城无效的class。为了尽可能探测一些错误,使用CheckClassAdapter。像TraceClassVistor一样,该类实现了ClassVisitor,并代理了所有调用到其他ClassVisitor,在委托给其下一个visitor之前,检查他的方法以合适的顺序和有效的参数被调用。

ClassWriter cw = new ClassWriter(0);
TraceClassVisitor tcv = new TraceClassVisitor(cw, printWriter);
CheckClassAdapter cv = new CheckClassAdapter(tcv);
cv.visit(...);
...
cv.visitEnd();
byte b[] = cw.toByteArray();

也可以调整chain的顺序。

ASMifierClassVisitor

    ASMifierClassVisitor实现了ClassVisitor接口:每个方法打印被调用的Java code。例如调用visitEnd()打印cv.visitEnd()。结果就是当这个visitor访问一个类的时候,它使用ASM打印源代码类生成这个类。当你使用这个visitor来访问已经存在的类非常有用。例如,你不知道如何使用ASM生成编译过的class,写源代码,使用javac编译,使用ASMifierClassVisitor访问编译过的class,就可以得到生成这个编译过的class的ASM代码。

java -classpath asm.jar:asm-util.jar \
org.objectweb.asm.util.ASMifierClassVisitor \
java.lang.Runnable

package asm.java.lang;
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(V1_5, ACC_PUBLIC + ACC_ABSTRACT + ACC_INTERFACE,"java/lang/Runnable",
                 null, "java/lang/Object", null);
        {
            mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "run", "()V",null, null);
            mv.visitEnd();
        }
        cw.visitEnd();
        return cw.toByteArray();
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值