Java 字节码操控框架ASM(四):Tools

一、Type

A Type object represents a Java type

  1. Type.getType(String.class).getInternalName() :结果是 java/lang/String
  2. Type.getType(String.class).getDescriptor() :其实就是 Ljava/lang/String;
  3. Type.INT_TYPE.getDescriptor() :就是类型描述符 I
  4. Type.getArgumentTypes(“(I)V”) :获取参数类型
  5. 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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

outer199

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值