ClassReader类用于解析类字节码,创建ClassReader对象可传入类名、类字节码数组或者类输入流对象。
创建完ClassReader对象就会触发字节码解析(解析class基础信息,如常量池、接口信息等),所以可以直接通过ClassReader对象获取类的基础信息,如下:
// 创建ClassReader对象,用于解析类对象,可以根据类名、二进制、输入流的方式创建final ClassReader cr = new ClassReader(className);System.out.println("解析类名:" + cr.getClassName() + ",父类:" + cr.getSuperName() +",实现接口:" + Arrays.toString(cr.getInterfaces()));
调用ClassReader类的accpet方法需要传入自定义的ClassVisitor对象,ClassReader会按照如下顺序,依次调用该ClassVisitor的类方法。
visit[ visitSource ] [ visitModule ][ visitNestHost ][ visitPermittedclass ][ visitOuterClass ]( visitAnnotation | visitTypeAnnotation | visitAttribute )*( visitNestMember | visitInnerClass | visitRecordComponent | visitField | visitMethod )*visitEnd
ClassVisitor类图:
