ClassReader简介说明

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

转自:
http://www.java265.com/JavaCourse/202206/3610.html
下文笔者将讲述ClassReader的用途简介说明,如下所示:
ClassReader的功能
  1. ClassReader隶属于ASM jar包
  2. ClassReader的功能:
  3.      用于在java运行时获取class信息
  4. 注意事项:
  5.      ClassReader和反射的区别在于:ClassReader可以对类进行读和写两种操作
  6.   而反射只可以进行进行读
复制代码
如何使用ClassReader呢?
  1. 步骤1:
  2.    引入jar包
  3.    <dependency>
  4.     <groupId>org.ow2.asm</groupId>
  5.     <artifactId>asm</artifactId>
  6.     <version>7.1</version>
  7. </dependency>
  8. asm中常见的对象:
  9.    ClassReader
  10.       按照Java虚拟机规范中定义的方式来解析class文件中的内容
  11.            在遇到合适的字段时调用ClassVisitor中相对应的方法。
  12. ClassVisitor
  13.       java中类的访问者,提供一系列方法由ClassReader调用
  14.           是一个抽象类,我们在使用的时候需要继承此类。使用此对象的时候需要指定asm api的版本
  15. ModuleVisitor
  16.       Java中模块的访问者,作为ClassVisitor.visitModule方法的返回值
  17.           要是不关心模块的使用情况,可以返回一个null。使用此对象的时候需要指定asm api的版本
  18. AnnotationVisitor
  19.       Java中注解的访问者,作为ClassVisito中visitTypeAnnotation和visitTypeAnnotation的返回值
  20.           要是不关心注解的使用情况,可以返回一个null。使用此对象的时候需要指定asm api的版本。
  21. FieldVisitor
  22.       Java中字段的访问者,作为ClassVisito.visitField的返回值
  23.           要是不关心字段的使用情况,可以返回一个null
  24.           使用此对象的时候需要指定asm api的版本。
  25. MethodVisitor
  26.       Java中方法的访问者,作为ClassVisito.visitMethod的返回值
  27.           要是不关心方法的使用情况,可以返回一个null
  28.           使用此对象的时候需要指定asm api的版本
复制代码
ClassReader操作类的示例分享
  1. package com.java265.testmaven.com.java265.testmaven;
  2. import java.io.IOException;
  3. import java.util.Arrays;
  4. import org.springframework.asm.ClassReader;
  5. import org.springframework.asm.ClassVisitor;
  6. import org.springframework.asm.Opcodes;
  7. public class TestClass {
  8.         /**
  9.          * java265.com之 ClassReader示例分享
  10.          *
  11.          * @throws IOException
  12.          */
  13.         public static void main(String[] args) throws IOException {
  14.                 ClassReader classReader = new ClassReader(TestClass6.class.getName());
  15.                 classReader.accept(new ClassVisitor(Opcodes.ASM7) {
  16.                         {
  17.                                 System.out.println("init ClassVisitor");
  18.                         }
  19.                 }, ClassReader.SKIP_DEBUG);
  20.                 System.out.println(classReader.getClassName());
  21.                 System.out.println(Arrays.toString(classReader.getInterfaces()));
  22.                 System.out.println(classReader.getSuperName());
  23.                 System.out.println(classReader.getAccess());
  24.         }
  25. }
  26. class TestClass6 {
  27. }
  28. ------运行以上代码,将输出以下信息----
  29. init ClassVisitor
  30. com/java265/testmaven/com/java265/testmaven/TestClass6
  31. []
  32. java/lang/Object
  33. 32
复制代码
例2: ClassReader从文件中读取字节码信息
  1. package com.java265.testmaven.com.java265.testmaven;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.util.Arrays;
  6. import org.springframework.asm.ClassReader;
  7. import org.springframework.asm.ClassVisitor;
  8. import org.springframework.asm.Opcodes;
  9. public class TestClass {
  10.         /**
  11.          * java265.com之 ClassReader示例分享
  12.          *
  13.          * @throws IOException
  14.          */
  15.         public static void main(String[] args) throws IOException {
  16.                 // 使用byte[]
  17.                 File classFile = new File("/target/classes/com/java265/testmaven/TestClass6.class");
  18.                 @SuppressWarnings("resource")
  19.                 FileInputStream inputStream = new FileInputStream(classFile);
  20.                 byte[] classBytes = new byte[inputStream.available()];
  21.                 inputStream.read(classBytes);
  22.                 ClassReader classReader = new ClassReader(classBytes);
  23.                 classReader.accept(new ClassVisitor(Opcodes.ASM7) {
  24.                         {
  25.                                 System.out.println("init ClassVisitor");
  26.                         }
  27.                 }, ClassReader.SKIP_DEBUG);
  28.                 System.out.println(classReader.getClassName());
  29.                 System.out.println(Arrays.toString(classReader.getInterfaces()));
  30.                 System.out.println(classReader.getSuperName());
  31.                 System.out.println(classReader.getAccess());
  32.         }
  33. }
  34. class TestClass6 {
  35. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表