查看.class文件命令:
javap -c xxx.class
root@penny ~/c/e/s/s/t/c/c/s/c/s/asm# javap -c ./ASMTest.class
Compiled from "ASMTest.java"
public class com.spring.cloud.springcloudnew.asm.ASMTest {
public com.spring.cloud.springcloudnew.asm.ASMTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.io.FileNotFoundException;
常用方法介绍:
public final void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
ClassWriter类中方法说明:
(1)定义类头部信息
version:类版本
access:类的访问标识
name:类名称
signature:类签名,如果类不是通用类,并且不扩展或实现泛型类或接口,则可能为null。
superName:超类名称,如果是接口或超类为Object则可能为null
interfaces:类实现的接口名称列表
(2)定义类属性
public final FieldVisitor visitField(int access, String name, String desc, String signature, Object value)
access:字段访问标识
name:字段名称
desc:字段描述
signature:字段签名,若字段类型不是泛型则可以为null
value:字段初始值
(3)定义类方法
public final MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
access:方法访问标识
name:方法名称
desc:方法描述
signature:方法签名,若方法参数、返回类型和异常没有使用泛型则可能为null
exceptions:方法的异常名,可能为null
示例1:
import org.springframework.asm.ClassWriter;
import org.springframework.asm.Opcodes;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class HelloWorld extends ClassLoader{
public static void main(String[] args) throws IOException {
//生成一个类只需要ClassWriter组件即可
ClassWriter cw = new ClassWriter(0);
//通过visit方法确定类的头部信息
String path="springboot.privateDemo.asm.helloworld.Comparable";
String interfacePath="springboot.privateDemo.asm.helloworld.Mesurable";
path.replace(".","/");
interfacePath.replace(".","/");
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
path, null, "java/lang/Object",
new String[] {interfacePath});
// 定义类的属性
cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC,
"LESS", "I", null, new Integer(-1)).visitEnd();
cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC,
"EQUAL", "I", null, new Integer(0)).visitEnd();
cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,
"GREATER", "I", null, new Integer(1)).visitEnd();
// 定义类的方法
cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo",
"(Ljava/lang/Object;)I", null, null).visitEnd();
//使cw类已经完成
cw.visitEnd();
//将cw转换成字节数组写到文件里面去
byte[] data = cw.toByteArray();
String savePath="D:\\vipkid\\private\\private\\src\\main\\java\\springboot\\privateDemo\\asm\\helloworld\\Generator.class";
// savePath=savePath.replace(".","/");
// savePath=savePath.concat("/Generator.class");
File file = new File(savePath);
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
}
}
接口:
public interface Mesurable {
}
【参考博客】
1.https://blog.csdn.net/aesop_wubo/article/details/48948211
网友评论