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

来源:互联网 发布:自学java如何找工作 编辑:程序博客网 时间:2024/05/16 08:15

一、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 0x601public 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
原创粉丝点击