`

使用ASM访问一个类

阅读更多

使用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类class文件

    ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...

    oracle不使用oracleasm的包配置ASM磁盘配置方法

    udev 是 Linux 内核设备管理子系统的一个重要组件,负责处理内核发出的设备事件,并根据预定义的规则对设备节点进行管理。在配置 ASM 磁盘的过程中,通过编写适当的 udev 规则,可以实现对磁盘的自动化管理,包括...

    ASM使用指南-中文版

    ASM是一个强大的Java字节码操控和分析框架,它允许开发者动态生成或修改Java类和运行时的类。这个“ASM使用指南-中文版”提供了全面的教程和参考信息,帮助开发者深入理解并有效地利用ASM库。 ASM的核心功能在于...

    Android-Android无痕埋点框架使用ASM插桩实现

    1. **创建ClassAdapter**: 首先,我们需要继承ASM的ClassAdapter类,创建一个自定义的适配器,用于接收和处理类的字节码信息。在这个适配器中,我们需要重写visitMethod方法,该方法会在遇到类的每个方法时被调用。 ...

    ASM4手册中文版.pdf.zip

    ASM是一个低级别的库,可以直接操作和生成类的字节码,这在创建编译器、代码分析工具以及运行时代码修改等方面非常有用。下面将详细解释ASM4及其在JAVA开发中的应用。 首先,ASM4提供了访问和修改Java类和方法的...

    cglib-2.2.jar asm-tree.jar asm-commons.jar asm.jar

    **ASM-Commons** 是ASM库的一个扩展,提供了对ASM的一些常见用法的支持,如访问框架、类收集器、事件监听器等。asm-commons.jar包含了这些辅助功能,使得开发者更容易使用ASM进行字节码操作。 **ASM-Tree** 是ASM库...

    10 - ASM使用ClassWrite生成类 - 简书1

    在提供的代码示例中,我们看到如何使用ASM库来动态生成一个名为`HelloWorld`的类。以下是对该过程的详细解释: 1. **创建ClassWriter对象**: 在`HelloWorldGenerateCore`类的`dump()`方法中,首先创建了一个`Class...

    asm-3.3.1.jar

    ClassReader用于读取和解析.class文件,提供了一个API来遍历和访问类的结构。ClassWriter则负责生成新的.class文件,可以根据ClassReader提供的信息或者通过自定义的字节码操作进行修改。访问器工厂则简化了对字段和...

    ASM4.2 DEMO

    ASM是一个强大的Java字节码操作框架,主要用于动态生成和修改Java类和方法。在ASM 4.2这个DEMO中,我们将深入探讨ASM的核心概念、功能以及如何利用它来实现动态编程。 首先,ASM的核心是它的类访问器和类适应器机制...

    asm-7.1.zip

    ASM 是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。ASM 可以直接生成和分析Java虚拟机(JVM)的字节码,因此在很多领域都有广泛的应用,比如Java代理、AOP(面向切面编程)、代码生成...

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar

    ASM是一个强大的Java字节码操控和分析框架,它可以直接生成和修改Java类和注解的字节码。这个框架主要用于动态代理、代码分析以及优化等场景。在Java开发中,当我们需要在运行时生成或者修改类的行为时,ASM提供了一...

    asm 6.0 工具集

    **ASM-Util**是ASM的实用工具模块,提供了许多方便开发者使用的辅助工具和类。这些工具通常简化了常见的字节码操作任务,例如生成注解、处理异常表、计算类和方法的哈希值等。ASM-Util中的类和方法可以大大提升开发...

    asm-2.2.1-sources.jar.zip

    标题中的"asm-2.2.1-sources.jar.zip"是一个包含ASM库源代码的压缩文件,版本号为2.2.1。ASM是一个Java字节码操控和分析框架,常用于动态代理、代码生成以及Java字节码的深度分析。这个文件可能是为了帮助开发者理解...

    asm-7.1(jar以及源码).rar

    ASM 是一个Java字节码操控和分析框架,它能被用来动态生成类或者增强已有类的功能。ASM 可以直接生成和分析Java虚拟机(JVM)的字节码,因此在很多领域都有广泛的应用,比如编译器、动态代理、AOP(面向切面编程)、...

    ASM-all 6.2

    ASM是一个强大的Java字节码操控和分析框架,它可以直接生成和修改Java类和注解的字节码。ASM-all 6.2是ASM框架的一个版本,这个版本包含了ASM的主要组件和依赖,使得开发者可以在项目中方便地引入和使用ASM。 在ASM...

    AOP 的利器 ASM 3.0

    - 首先,我们需要使用ASM创建一个类访问器,该访问器将遍历Account类的字节码并对其进行修改。 - 接着,在遍历过程中,我们将在`operation`方法的前后添加对`SecurityChecker.checkSecurity()`的调用。 4. **实现...

    asm的jar包

    ASM是一个Java字节码操控和分析框架,常用于动态代理、代码分析以及转换等场景。它的核心在于提供了一种能够直接操作和修改Java类文件的底层API,这使得开发者能够深入到Java字节码级别进行编程,实现一些高级功能,...

    ASM中文帮助文档

    ASM是一个轻量级的库,提供了对Java字节码的低级别访问。它能够直接操作字节码,从而可以用于创建、加载或修改类。ASM提供了两种主要的API:ClassWriter用于生成字节码,而ClassReader则用于解析已存在的字节码。 ...

    asm-tree.jar

    ASM是一个高效的、低级别的库,主要用于动态生成类或分析现有类,广泛应用于Java代理、AOP(面向切面编程)、代码生成等场景。ASM Tree库则是ASM框架中用于构建和解析抽象语法树(Abstract Syntax Tree, AST)的模块...

Global site tag (gtag.js) - Google Analytics