盘古BPM体验地址    盘古BPM交流群盘古BPM交流群号:963222735

使用asm读取类观察Signature

分享牛 1802℃

在使用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