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类图: