使用ASM4可以方便的访问一个类文件结构内容,只需要实现ClassVisitor接口或继承ClassAdapter
注意,ASM基于责任链模式设计,有严格的访问顺序,如下:
visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )* ( visitInnerClass | visitField | visitMethod )* visitEnd
ASM会依次调用方法visit,visitSource...,"?"表示调用0次或一次,"*"表示调用多次。
下面看一个简单的访问过程:
public class ClassReaderExample { private static class MyClassVisitor implements ClassVisitor { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { System.out.println("class name:" + name); System.out.println("super class name:" + superName); System.out.println("class version:" + version); System.out.println("class access:" + access); System.out.println("class signature:" + signature); if (interfaces != null && interfaces.length > 0) { for (String str : interfaces) { System.out.println("implemented interface name:" + str); } } } @Override public void visitSource(String source, String debug) { System.out.println("source:"+source); } @Override public void visitOuterClass(String owner, String name, String desc) { System.out.println("owner:" + owner); System.out.println("outerName:" + name); } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { return null; } @Override public void visitAttribute(Attribute attr) { System.out.println("attribute" + attr); } @Override public void visitInnerClass(String name, String outerName, String innerName, int access) { System.out.println("innerClass" + name); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { System.out.println("field:" + name + ",access" + access + ",desc"+ desc); return null; } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { System.out.println("method:" + name + ",access" + access + ",desc" + desc); return null; } @Override public void visitEnd() { System.out.println("visitEnd"); } } public static void main(String args[]) throws IOException { ClassReader classReader = new ClassReader("java.lang.String"); classReader.accept(new MyClassVisitor(), 0); } }
相关推荐
ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...
udev 是 Linux 内核设备管理子系统的一个重要组件,负责处理内核发出的设备事件,并根据预定义的规则对设备节点进行管理。在配置 ASM 磁盘的过程中,通过编写适当的 udev 规则,可以实现对磁盘的自动化管理,包括...
ASM是一个强大的Java字节码操控和分析框架,它允许开发者动态生成或修改Java类和运行时的类。这个“ASM使用指南-中文版”提供了全面的教程和参考信息,帮助开发者深入理解并有效地利用ASM库。 ASM的核心功能在于...
1. **创建ClassAdapter**: 首先,我们需要继承ASM的ClassAdapter类,创建一个自定义的适配器,用于接收和处理类的字节码信息。在这个适配器中,我们需要重写visitMethod方法,该方法会在遇到类的每个方法时被调用。 ...
ASM是一个低级别的库,可以直接操作和生成类的字节码,这在创建编译器、代码分析工具以及运行时代码修改等方面非常有用。下面将详细解释ASM4及其在JAVA开发中的应用。 首先,ASM4提供了访问和修改Java类和方法的...
**ASM-Commons** 是ASM库的一个扩展,提供了对ASM的一些常见用法的支持,如访问框架、类收集器、事件监听器等。asm-commons.jar包含了这些辅助功能,使得开发者更容易使用ASM进行字节码操作。 **ASM-Tree** 是ASM库...
在提供的代码示例中,我们看到如何使用ASM库来动态生成一个名为`HelloWorld`的类。以下是对该过程的详细解释: 1. **创建ClassWriter对象**: 在`HelloWorldGenerateCore`类的`dump()`方法中,首先创建了一个`Class...
ClassReader用于读取和解析.class文件,提供了一个API来遍历和访问类的结构。ClassWriter则负责生成新的.class文件,可以根据ClassReader提供的信息或者通过自定义的字节码操作进行修改。访问器工厂则简化了对字段和...
ASM是一个强大的Java字节码操作框架,主要用于动态生成和修改Java类和方法。在ASM 4.2这个DEMO中,我们将深入探讨ASM的核心概念、功能以及如何利用它来实现动态编程。 首先,ASM的核心是它的类访问器和类适应器机制...
ASM 是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。ASM 可以直接生成和分析Java虚拟机(JVM)的字节码,因此在很多领域都有广泛的应用,比如Java代理、AOP(面向切面编程)、代码生成...
ASM是一个强大的Java字节码操控和分析框架,它可以直接生成和修改Java类和注解的字节码。这个框架主要用于动态代理、代码分析以及优化等场景。在Java开发中,当我们需要在运行时生成或者修改类的行为时,ASM提供了一...
**ASM-Util**是ASM的实用工具模块,提供了许多方便开发者使用的辅助工具和类。这些工具通常简化了常见的字节码操作任务,例如生成注解、处理异常表、计算类和方法的哈希值等。ASM-Util中的类和方法可以大大提升开发...
标题中的"asm-2.2.1-sources.jar.zip"是一个包含ASM库源代码的压缩文件,版本号为2.2.1。ASM是一个Java字节码操控和分析框架,常用于动态代理、代码生成以及Java字节码的深度分析。这个文件可能是为了帮助开发者理解...
ASM 是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。ASM 可以直接生成和分析Java虚拟机(JVM)的字节码,因此在很多领域都有广泛的应用,比如编译器、动态代理、AOP(面向切面编程)、...
ASM是一个强大的Java字节码操控和分析框架,它可以直接生成和修改Java类和注解的字节码。ASM-all 6.2是ASM框架的一个版本,这个版本包含了ASM的主要组件和依赖,使得开发者可以在项目中方便地引入和使用ASM。 在ASM...
- 首先,我们需要使用ASM创建一个类访问器,该访问器将遍历Account类的字节码并对其进行修改。 - 接着,在遍历过程中,我们将在`operation`方法的前后添加对`SecurityChecker.checkSecurity()`的调用。 4. **实现...
ASM是一个Java字节码操控和分析框架,常用于动态代理、代码分析以及转换等场景。它的核心在于提供了一种能够直接操作和修改Java类文件的底层API,这使得开发者能够深入到Java字节码级别进行编程,实现一些高级功能,...
ASM是一个轻量级的库,提供了对Java字节码的低级别访问。它能够直接操作字节码,从而可以用于创建、加载或修改类。ASM提供了两种主要的API:ClassWriter用于生成字节码,而ClassReader则用于解析已存在的字节码。 ...
ASM是一个高效的、低级别的库,主要用于动态生成类或分析现有类,广泛应用于Java代理、AOP(面向切面编程)、代码生成等场景。ASM Tree库则是ASM框架中用于构建和解析抽象语法树(Abstract Syntax Tree, AST)的模块...