Java 字节码操控框架ASM(四):Tools
来源:互联网 发布:自学java如何找工作 编辑:程序博客网 时间:2024/05/16 08:15
一、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 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
- Java 字节码操控框架ASM(四):Tools
- ASM - Java 字节码操控框架
- Java 字节码操控框架ASM(二):Parsing class
- Java 字节码操控框架ASM(三):修改 classes
- Java 字节码操控框架ASM(一):创建class文件
- asm java字节码操控工具学习
- ASM java字节码框架
- Java字节码框架ASM
- JAVA ASM字节码操纵框架
- Java字节码框架asm快速入门
- ASM-java字节码控制框架
- java字节码框架ASM的学习
- Java字节码框架ASM-读写字节码的用法
- Java字节码框架ASM-读写字节码的用法
- Java字节码框架ASM-读写字节码的用法
- 10013---ASM字节码框架
- 关于java字节码框架ASM的学习
- 关于java字节码框架ASM的学习
- tensorflow 关于张量 shape 数组
- php 防止sql注入
- SVN服务器搭建和使用(二)
- Resolve
- Linux常见问题
- Java 字节码操控框架ASM(四):Tools
- fastdfs-分布式存储设计指导(三)
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)
- Wamp配置虚拟主机目录
- 解析URL各部分的通用方法
- Ubuntu14.04无法使用32位应用程序解决记录
- 获取版本号、版本名
- Python中的类class
- hdu1232 畅通工程 并查集的 应用