在使用asm操作字节码的时候,经常要大量的使用到一些常见的数据类型,比如我们在java中直接使用的String类型,在jvm中对应的表示类型是什么呢?我们不妨尝试操作一次,一探究竟。
同样的,我们需要引入asm包,然后新建一个测试类进行操作。步骤如下:
1.新建测试类ShareniuReadClassTest ,实例代码如下所示:
public class ShareniuReadClassTest { public static final int a=10; public static void main(String[] args) throws Exception { } }
2.在ShareniuReadClassTest类写一个常用的方法以及测试参数,实例代码如下所示:
private double test1(boolean b,byte byte_,char c,short s,int i,String a,float f,long l,double d) { return 0L; } private void hi(List<String> b,String[] str,int[] i,List<String> list) { }
3.书写asm中的ClassPrinter并继承ClassVisitor类。该类主要用于打印类以及方法的签名等信息。实例代码如下所示:
static class ShareniuClassPrinter extends ClassVisitor { public ShareniuClassPrinter(int api) { super(Opcodes.ASM5); } public void visit(int version, int access, String name, String signature, String superName,String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces); // 打印出父类name和本类name System.out.println("父类名称:"+superName + " " + name); } public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { // 打印出方法名和类型签名 System.out.println(name + " " + desc); return super.visitMethod(access, name, desc, signature, exceptions); } }
4.测试,实例代码如下所示:
public static void main(String[] args) throws Exception { ShareniuClassPrinter printer = new ShareniuClassPrinter(Opcodes.ASM5); ClassReader cr = new ClassReader("com.shareniu.asm.helloword.ShareniuReadClassTest"); cr.accept(printer, 0); }
控制台的打印信息如下:
父类名称:java/lang/Object com/shareniu/asm/helloword/ShareniuReadClassTest <init> ()V main ([Ljava/lang/String;)V test1 (ZBCSILjava/lang/String;FJD)D hi (Ljava/util/List;[Ljava/lang/String;[ILjava/util/List;)V
上述的输出信息可以结合第2个步骤进行观察,我们总结一下。
类型对比表
Type Signature |
Java Type |
Z |
boolean |
B |
byte |
C |
char |
S |
short |
I |
int |
J |
long |
F |
float |
D |
double |
L |
fully-qualified-class ;fully-qualified-class |
[ type |
type[] |
( arg-types ) ret-type |
method type |
转载请注明:分享牛 » 使用asm读取类观察Signature