使用ASM动态创建类,可以不需要java源文件,或者在类被JAVA虚拟机装入内存之前,动态修改类。
如下,动态创建一个类Example.class并执行。
ClassWriter cw = new ClassWriter(0); cw.visit(V1_5, ACC_PUBLIC, "Example", null, "java/lang/Object", null); // creates a MethodWriter for the (implicit) constructor MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); // pushes the 'this' variable mw.visitVarInsn(ALOAD, 0); // invokes the super class constructor mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mw.visitInsn(RETURN); // this code uses a maximum of one stack element and one local variable mw.visitMaxs(1, 1); mw.visitEnd(); // creates a MethodWriter for the 'main' method mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); // pushes the 'out' field (of type PrintStream) of the System class mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); // pushes the "Hello World!" String constant mw.visitLdcInsn("Hello world!"); // invokes the 'println' method (defined in the PrintStream class) mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mw.visitInsn(RETURN); // this code uses a maximum of two stack elements and two local // variables mw.visitMaxs(2, 2); mw.visitEnd(); // gets the bytecode of the Example class, and loads it dynamically byte[] code = cw.toByteArray(); FileOutputStream fos = new FileOutputStream("d:/com/Example.class"); fos.write(code); fos.close(); Helloworld loader = new Helloworld(); Class<?> exampleClass = loader.defineClass("Example",code, 0, code.length); // uses the dynamically generated class to print 'Helloworld' exampleClass.getMethods()[0].invoke(null, new Object[] { null });
程序执行,打印“Hello world!”。
使用反编译工具查看CLASS文件,内容如下:
public class Example { public static void main(String[] paramArrayOfString) { System.out.println("Hello world!"); } }
相关推荐
ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...
实现基于ASM9,动态生成entity、repository、service、serviceImpl、controller相关.class 可根据库表,一键生成新增、修改删除、查询等接口 实现部分基于mybatis-plus,动态代码生成(相关包,未包含) 数据库文件...
7. **教程与学习资源**:"ASM4使用指南.pdf"文件应包含了关于如何启动ASM4,创建第一个模型,进行建模操作,运行模拟以及解读分析结果等内容。这份指南是学习和掌握ASM4的关键资源,建议用户按照指南逐步实践。 8. ...
### Oracle 不使用 OracleASM 的包配置 ASM 磁盘配置方法 #### 概述 在 Oracle 数据库系统中,自动存储管理(ASM)是用于管理数据库文件的一种高性能、高可用性的解决方案。通常情况下,ASM 依赖于 Oracle 提供的 ...
在RHEL5操作系统环境下,创建一个使用ASM(Oracle Automatic Storage Management)的Oracle数据库涉及多个步骤。ASM是Oracle数据库的一种存储管理技术,它自动化了磁盘管理和数据存储的复杂性,提供高可用性和性能优化...
4. **构建和加载类**: 最后,使用ASM的ClassWriter生成新的字节码,然后通过DexClassLoader或其他类加载器动态加载到Android系统中。 MonitorDemo-master项目很可能包含了一个示例的Android无痕埋点框架实现,包括...
3. **元编程**:ASM库允许开发者在运行时动态创建或修改类,这对于构建元编程框架或字节码级别的调试工具至关重要。 4. **字节码分析**:ASM-Tree提供了对字节码的高级抽象,便于进行代码分析和修改,对于字节码级别...
ASM允许动态添加和删除磁盘,以适应存储需求的变化。添加磁盘使用`ALTER DISKGROUP`命令,删除磁盘则使用`DROP DISK`命令。 - **管理ASM磁盘组** 磁盘组是ASM存储的逻辑单位,包含一组磁盘,提供冗余和故障恢复...
- AOP框架:如Spring AOP,通过ASM动态生成代理类实现切面逻辑。 - 代码混淆:如ProGuard,利用ASM对字节码进行混淆,提高代码安全性。 - 性能监控:通过ASM动态插入监控代码,收集运行时性能数据。 - 运行时代码...
ASM是一个强大的Java字节码操控和分析框架,它允许开发者动态生成或修改Java类和运行时的类。这个“ASM使用指南-中文版”提供了全面的教程和参考信息,帮助开发者深入理解并有效地利用ASM库。 ASM的核心功能在于...
ASM库允许开发者直接操作字节码,创建和修改类,甚至在运行时动态生成类。ASM通过访问者模式设计,使得在字节码级别进行操作变得简洁高效。ASM支持JVM规范的所有版本,包括Java 8及更高版本的特性,如lambda表达式和...
1. 动态生成类:ASM允许你在运行时动态创建新的类和接口。这对于实现代码生成器或者运行时类型定制非常有用。例如,你可以创建一个表示数据库记录的动态类,其中包含字段和方法,这些都根据数据库表结构自动生成。 ...
通过直接生成二进制`.class`文件,ASM能够在类被加载到Java虚拟机之前动态地改变类的行为。 - **应用场景**: - **程序分析**:用于查找应用程序中的潜在错误、检测未使用的代码以及实现代码逆向工程。 - **程序...
4. **示例**:有时,压缩包中还会包含示例代码,演示如何使用ASM来实现某些特定功能,如创建动态代理、修改类或方法的行为等。 5. **构建脚本和配置文件**:如`pom.xml`(如果是Maven项目)或者`build.gradle`...
使用ASM动态修改字节码的优势在于,它不仅能够立即改变日志级别,还可以实现基于关键字或其他条件的实时日志过滤,减少IO和磁盘空间的消耗。然而,这种方法需要一定的编程技能,可能不适合所有运维人员自行操作。 ...
标题中的“asm4.0全家福”指的是ASM库的一个完整版本集合,ASM是一个Java字节码操控和分析框架,主要用于动态生成类或者增强已有类的功能。这个“全家福”包括了ASM库的主要组件,分别是: 1. **asm-4.0**: 这是ASM...
ASM提供了底层的字节码操作能力,而CGlib则在其上构建了一个更易于使用的API,使得开发者无需直接与ASM的复杂接口打交道,就能实现类的动态扩展和代理。CGlib封装了ASM的一些细节,提供了更高级别的抽象,使得开发者...
1. **ASM 示例**: 使用ASM创建一个新的类,或者修改已有的类,例如添加新的字段、方法,或者在已有方法中插入额外的逻辑。 2. **CGlib 示例**: 创建一个代理对象,该代理对象会在目标方法调用前后插入自定义的行为,...
它主要用来在运行时动态创建子类,以此来实现对目标对象的代理。在Java中,由于无法直接对非接口实现类进行代理(JDK动态代理仅支持接口代理),所以cglib通过继承目标类的方式来创建代理对象。当一个类没有接口或者...