什么是ClassVisitor

发布时间:2021-10-11 10:58:12 作者:iii
来源:亿速云 阅读:167

这篇文章主要讲解了“什么是ClassVisitor”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是ClassVisitor”吧!

简介

ClassVisitor是用来生成asm和改变字节码的,ClassVisitor是一个访问字节码的框架,其对字节码的创建和修改主要是通过其内部的ClassVisitor具体实现来代理的;
ClassVisitor对一个java类的访问是有一定顺序的,其具体顺序如下:

visit [visitSource] [visitModule] [visitNestHost][visitOuterClass](visitAnnotation | visitTypeAnnotation|visitAttribute)*
(visitNestMember|visitInnerClass|visitField| visitMethod)* visitEnd;
说明:visit,visitEnd必须调用一次,[]表示最多调用一次;
()*表示()里面的访问可以按照排列顺序调用多次;

方法说明

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类的父类名称;
  public void visitSource(final String source, final String debug) {if (cv != null) {  cv.visitSource(source, debug);}
  }

nest 指的一个共享私有成员变量的包名相同的class集合,nest中有一个host(主类)和多个members(成员类),jdk11为了提供更大,更广泛的嵌套类型,并且为了补足访问控制检测不足,引进了两个新的class文件属性,nest host 和nest member,nest host中包含了一个nest members列表,用来确定其他静态nest members;nest member中包含了一个nest host属性用来确定它的nesthost;

  public AnnotationVisitor visitAnnotation(final String descriptor, final boolean visible) {if (cv != null) {  return cv.visitAnnotation(descriptor, visible);}return null;
  }其中:
descriptor:表示类注解类的描述;
visible表示该注解是否运行时可见;return AnnotationVisitor:表示该注解类的Visitor,可以用来访问注解值;
 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:该注解类型运行时是否可见;
public void visitAttribute(final Attribute attribute) {if (cv != null) {  cv.visitAttribute(attribute);}
  }
  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:表示将返回一个可以访问该域注解和属性的访问对象,如果不感兴趣的话,可以设置为空;
  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:表示方法的参数类型和返回值类型;

感谢各位的阅读,以上就是“什么是ClassVisitor”的内容了,经过本文的学习后,相信大家对什么是ClassVisitor这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 什么是PHP
  2. 什么是python

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:PHP反序列化中如何寻找POP链

下一篇:ThinkPHP5中的SQL注入漏洞是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》