这篇文章主要讲解了“什么是ClassVisitor”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是ClassVisitor”吧!
ClassVisitor是用来生成asm和改变字节码的,ClassVisitor是一个访问字节码的框架,其对字节码的创建和修改主要是通过其内部的ClassVisitor具体实现来代理的;
ClassVisitor对一个java类的访问是有一定顺序的,其具体顺序如下:
visit [visitSource] [visitModule] [visitNestHost][visitOuterClass](visitAnnotation | visitTypeAnnotation|visitAttribute)*
(visitNestMember|visitInnerClass|visitField| visitMethod)* visitEnd;
说明:visit,visitEnd必须调用一次,[]表示最多调用一次;
()*表示()里面的访问可以按照排列顺序调用多次;
visit:访问类的头部,
public void visit(final int version,final int access, final String name, final String signature, final String superName, final String[] interfaces){ if (cv != null) { cv.visit(version, access, name, signature, superName, interfaces);}}; 其中version指的是类的版本; acess指的是类的修饰符; name类的名称; signature类的签名,如果类不是泛型或者没有继承泛型类,那么signature为空; superName类的父类名称;
visitSource: 访问类的源码,就是.java文件,一般情况用不上;
public void visitSource(final String source, final String debug) {if (cv != null) { cv.visitSource(source, debug);} }
visitModule:暂时不清楚用来干嘛的,用的比较少;
visitNestHost:访问类的nest host;
nest 指的一个共享私有成员变量的包名相同的class集合,nest中有一个host(主类)和多个members(成员类),jdk11为了提供更大,更广泛的嵌套类型,并且为了补足访问控制检测不足,引进了两个新的class文件属性,nest host 和nest member,nest host中包含了一个nest members列表,用来确定其他静态nest members;nest member中包含了一个nest host属性用来确定它的nesthost;
visitOuterClass: 访问类的外部类,一般用于nest-class;
visitAnnotation:访问类的注解;
public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {if (cv != null) { return cv.visitAnnotation(descriptor, visible);}return null; }其中: descriptor:表示类注解类的描述; visible表示该注解是否运行时可见;return AnnotationVisitor:表示该注解类的Visitor,可以用来访问注解值;
visitTypeAnnotation:访问类的签名类型(某个泛型)的注解;
public AnnotationVisitor visitTypeAnnotation( final int typeRef, final TypePath typePath, final String descriptor, final boolean visible) {if (api < Opcodes.ASM5) { throw new UnsupportedOperationException("This feature requires ASM5");}if (cv != null) { return cv.visitTypeAnnotation(typeRef, typePath, descriptor, visible);}return null; }其中:typeRef:指的是类型引用,在这里只能是TypeReference.(CLASS_TYPE_PARAMETER |CLASS_TYPE_PARAMETER_BOUND|CLASS_EXTENDS ); typePath:被注解的类型参数,wildcard bound,array element type,包含typeRef的static inner type;descriptor: 注解类的描述; visible:该注解类型运行时是否可见;
visitAttribute:访问类的非标准属性;
public void visitAttribute(final Attribute attribute) {if (cv != null) { cv.visitAttribute(attribute);} }
visitNestMember:访问嵌套类的nest member,只有host class被visited时才能调用该方法
visitInnerClass:访问一个内部类的信息;
visitField:访问一个类的域信息,如果需要修改或者新增一个域,可以通过重写此方法;
public FieldVisitor visitField( final int access, final String name, final String descriptor,final String signature, final Object value) {if (cv != null) { return cv.visitField(access, name, descriptor, signature, value);}return null; }其中 access:表示该域的访问方式,public,private或者static,final等等; name:指的是域的名称; descriptro:域的描述,一般指的是该field的参数类型;signature:指的是域的签名,一般是泛型域才会有签名;value:指的该域的初始值 reture FiedVisitor:表示将返回一个可以访问该域注解和属性的访问对象,如果不感兴趣的话,可以设置为空;
visitMethod:访问类的方法,如果需要修改类方法信息,则可以重写此方法;
public MethodVisitor visitMethod( final int access,final String name,final String descriptor,final String signature, final String[] exceptions) {if (cv != null) { return cv.visitMethod(access, name, descriptor, signature, exceptions);}return null; }其中: decsriptor:表示方法的参数类型和返回值类型;
visitEnd:访问类的尾部,只有当类访问结束时,才能调用该方法,同时必须调用该方法;
感谢各位的阅读,以上就是“什么是ClassVisitor”的内容了,经过本文的学习后,相信大家对什么是ClassVisitor这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。