首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当使用ASM访问一个类时,如何在不加载任何类的情况下知道该类的祖先类?

当使用ASM访问一个类时,可以通过ASM提供的ClassVisitor类来获取类的祖先类信息,而无需加载任何类。

具体步骤如下:

  1. 创建一个自定义的ClassVisitor类,继承自ASM的ClassVisitor类。
  2. 在自定义的ClassVisitor类中重写visit方法,该方法会在访问到类的头部时被调用。
  3. 在visit方法中,通过调用super.visit方法,将访问控制权交给父类的visit方法。
  4. 在自定义的ClassVisitor类中重写visitMethod方法,该方法会在访问到类的方法时被调用。
  5. 在visitMethod方法中,通过调用super.visitMethod方法,将访问控制权交给父类的visitMethod方法。
  6. 在自定义的ClassVisitor类中重写visitField方法,该方法会在访问到类的字段时被调用。
  7. 在visitField方法中,通过调用super.visitField方法,将访问控制权交给父类的visitField方法。
  8. 在自定义的ClassVisitor类中重写visitInnerClass方法,该方法会在访问到类的内部类时被调用。
  9. 在visitInnerClass方法中,通过调用super.visitInnerClass方法,将访问控制权交给父类的visitInnerClass方法。
  10. 在自定义的ClassVisitor类中重写visitOuterClass方法,该方法会在访问到类的外部类时被调用。
  11. 在visitOuterClass方法中,通过调用super.visitOuterClass方法,将访问控制权交给父类的visitOuterClass方法。
  12. 在自定义的ClassVisitor类中重写visitSource方法,该方法会在访问到类的源文件时被调用。
  13. 在visitSource方法中,通过调用super.visitSource方法,将访问控制权交给父类的visitSource方法。
  14. 在自定义的ClassVisitor类中重写visitAnnotation方法,该方法会在访问到类的注解时被调用。
  15. 在visitAnnotation方法中,通过调用super.visitAnnotation方法,将访问控制权交给父类的visitAnnotation方法。
  16. 在自定义的ClassVisitor类中重写visitTypeAnnotation方法,该方法会在访问到类的类型注解时被调用。
  17. 在visitTypeAnnotation方法中,通过调用super.visitTypeAnnotation方法,将访问控制权交给父类的visitTypeAnnotation方法。
  18. 在自定义的ClassVisitor类中重写visitAttribute方法,该方法会在访问到类的属性时被调用。
  19. 在visitAttribute方法中,通过调用super.visitAttribute方法,将访问控制权交给父类的visitAttribute方法。
  20. 在自定义的ClassVisitor类中重写visitEnd方法,该方法会在访问到类的结束时被调用。
  21. 在visitEnd方法中,通过调用super.visitEnd方法,将访问控制权交给父类的visitEnd方法。

通过以上步骤,我们可以在不加载任何类的情况下,使用ASM访问一个类,并获取其祖先类的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JVM 《八 JVM JDK代理&CGLib 代理解析》

    前言&背景 现在Spring 什么的好火。 Spring 很经典的一个特性是AOP AOP 的基础是代理。 代理分为静态代理、动态代理。 静态代理,不好处挺明显的,工程中各式各样的代理代码,过于冗余。 动态代理显得就简洁多了。 动态代理在java中现在大约有这么两种技术。JDK 原生反射,字节码操作增强反射(我第一次学到这个的时候感觉特别特别高大上,虽然现在也这么感觉 然后字节码操作技术 比较火的就是ASM了,也就是CGLib所使用的技术。 至于啥是代理,就不多解释了。就是产生一个代理操作来替代原核心操作并且增加一些便利的具有各个场景特性的附加操作。 然后JDK&CGLib表象上或者语法上的区别,一个面向接口、一个面向类、Spring 根据情况使用也可强制。然后单独使用的时候写法儿上的不同。 那在JVM层面去看待这个问题是怎样的呢? 其实本质要讨论的就是Java 反射、字节码操作具体是怎么样的,有什么区别。 先说一个反射的总体概念 反射,顾名思义 反着射,跟常规编写、编译、解释执行不同。我当时看反射的时候挺蒙蔽的,反射?反?射?到系统的看编程思想的RTTI那一块,对于反射的定义还有这个名字多少有点认可了。 下面是百度的解释,感觉挺糟糕的 也就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 一个比较可取的解释 Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions The primitive Java types (boolean, byte, char, short, int, long, float, anddouble), and the keyword void are also represented as Class objects. 综合起来看,也就是运行期间根据名称去动态的加载及使用一个编译期未知的类,然后根据加载进来的Class对象,来调用该类具体的方法的行为。(静态加载、根据已知信息直接使用) 为什么是反着呢,因为我们常规写程序都是既定使用的类&方法然后import、然后加载产生Class对象&使用类的具体信息 驱动执行。(已知信息使用) 而反射是在运行时除了名称完全未知,通过名称获取&加载进来,然后产生Class对象,通过Class 对象的信息来获取调用这个类具体的内容。(动态加载、透过 Class 获取信息去调用) 当然,这个类通常是远程调用或者别的什么方式来获取使用的。 Java反射也就是上面说的常规过程,来加载&使用一个完全未知的类。 而且JDK代理有个特点,是针对接口来实现的,也就是面向接口来编程,这也就导致了 接口一致而非对象一致。并且Java 反射效率总体来说是比较低下。 为了解决这些个问题,ASM之类的字节码操作技术出现了。

    01

    2.2 ASM-类-接口和组件

    ASM API对编译类进行生成和编辑,都是基于抽象类ClassVisitor实现的(参照表格 2.4)。 该类中的每一个方法都对应class文件中的同名的结构部分(参考表格-2.1:编译后的class结构)。 简单的结构部分可以通过一个方法进行方法,该方法参数描述了该结构部分,返回void。 其他可能是任意长度和复杂性的结构部分,可以通过调用一个初始化方法,返回一个辅助的visitor类。 这便是visitAnnotation、visitField、和visitMethod的调用模式,这几个方法分别返回AnnotationVisitor、FieldVisitor和MethodVisitor。 同样的原则也适用于递归调用这些辅助类。例如每个方法在抽象类FieldVisitor中都对应了class文件中同名的子结构。

    01

    web安全防御之RASP技术

    1.一个Web应用开发到上线的过程大致须要经过如下步骤:需求分析、架构设计、系统设计、功能设计、编码实现、测试评估、上线部署、业务运营等关键步骤,其中功能设计、编码测试、发布部署、系统运营这几个环节中都会存在安全风险,但是针对各环节出现的安全风险目前还没有一个比较全面的防御产品。目前主流的Web应用安全防护产品方案较多的是 WAF(Web Application Firewall)和RASP(Runtime Application Self-Protection),WAF是门卫模型,通常部署在Web应用系统的外部边界,所有正常或恶意流量都需要通过特征规则和模式识别,通过特定的规则和模式识别出恶意请求,并且把它们拒之门外,拒绝向高风险的Web请求提供服务。

    03
    领券