溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是ClassVisitor

發(fā)布時(shí)間:2021-10-11 10:58:12 來源:億速云 閱讀:165 作者:iii 欄目:編程語言

這篇文章主要講解了“什么是ClassVisitor”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“什么是ClassVisitor”吧!

簡(jiǎn)介

ClassVisitor是用來生成asm和改變字節(jié)碼的,ClassVisitor是一個(gè)訪問字節(jié)碼的框架,其對(duì)字節(jié)碼的創(chuàng)建和修改主要是通過其內(nèi)部的ClassVisitor具體實(shí)現(xiàn)來代理的;
ClassVisitor對(duì)一個(gè)java類的訪問是有一定順序的,其具體順序如下:

visit [visitSource] [visitModule] [visitNestHost][visitOuterClass](visitAnnotation | visitTypeAnnotation|visitAttribute)*
(visitNestMember|visitInnerClass|visitField| visitMethod)* visitEnd;
說明:visit,visitEnd必須調(diào)用一次,[]表示最多調(diào)用一次;
()*表示()里面的訪問可以按照排列順序調(diào)用多次;

方法說明

  • 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:暫時(shí)不清楚用來干嘛的,用的比較少;

  • visitNestHost:訪問類的nest host;

nest 指的一個(gè)共享私有成員變量的包名相同的class集合,nest中有一個(gè)host(主類)和多個(gè)members(成員類),jdk11為了提供更大,更廣泛的嵌套類型,并且為了補(bǔ)足訪問控制檢測(cè)不足,引進(jìn)了兩個(gè)新的class文件屬性,nest host 和nest member,nest host中包含了一個(gè)nest members列表,用來確定其他靜態(tài)nest members;nest member中包含了一個(gè)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表示該注解是否運(yùn)行時(shí)可見;return AnnotationVisitor:表示該注解類的Visitor,可以用來訪問注解值;
  • visitTypeAnnotation:訪問類的簽名類型(某個(gè)泛型)的注解;

 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:被注解的類型參數(shù),wildcard bound,array element type,包含typeRef的static inner type;descriptor: 注解類的描述;
visible:該注解類型運(yùn)行時(shí)是否可見;
  • visitAttribute:訪問類的非標(biāo)準(zhǔn)屬性;

public void visitAttribute(final Attribute attribute) {if (cv != null) {  cv.visitAttribute(attribute);}
  }
  • visitNestMember:訪問嵌套類的nest member,只有host class被visited時(shí)才能調(diào)用該方法

  • visitInnerClass:訪問一個(gè)內(nèi)部類的信息;

  • visitField:訪問一個(gè)類的域信息,如果需要修改或者新增一個(gè)域,可以通過重寫此方法;

  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的參數(shù)類型;signature:指的是域的簽名,一般是泛型域才會(huì)有簽名;value:指的該域的初始值
reture FiedVisitor:表示將返回一個(gè)可以訪問該域注解和屬性的訪問對(duì)象,如果不感興趣的話,可以設(shè)置為空;
  • 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:表示方法的參數(shù)類型和返回值類型;
  • visitEnd:訪問類的尾部,只有當(dāng)類訪問結(jié)束時(shí),才能調(diào)用該方法,同時(shí)必須調(diào)用該方法;

感謝各位的閱讀,以上就是“什么是ClassVisitor”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)什么是ClassVisitor這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)
推薦閱讀:
  1. 什么是PHP
  2. 什么是python

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI