以下代码需要asm-5.0.2.jar和asm-commons-5.0.2.jar两个包。
package com.shihuan.field;
public class AccountField {
String sql = "select * from tables";
public void operation() {
System.out.println("shihuan operation...");
}
int executeInternal() {
System.out.println("shihuan executeInternal...");
return 1;
}
}
package com.shihuan.field;
public class TestAccountField {
public static void main(String[] args) {
AccountField t = new AccountField();
t.operation();
t.executeInternal();
}
}
package com.shihuan.field;
public class SecurityCheckerField {
public static java.util.Date getStartTime() {
long starttime = System.currentTimeMillis();
java.util.Date startdate = new java.util.Date(starttime);
System.out.println("shihuan starttime --->> " + startdate);
return startdate;
}
public static void checkCode(AccountField afObj) {
long endtime = System.currentTimeMillis();
java.util.Date enddate = new java.util.Date(endtime);
System.out.println("shihuan endtime --->> " + enddate);
System.out.println(afObj.sql);
}
}
package com.shihuan.field;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class GeneratorAsmField {
public static void main(String[] args) throws IOException {
ClassReader cr = new ClassReader("com.shihuan.field.AccountField");
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS);
ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); // 先得到原始的方法
MethodVisitor newMethod = mv;
if (mv != null) {
if ("executeInternal".equals(name)) { // 此处的executeInternal即为需要修改的方法,修改方法內容
// 访问需要修改的方法
newMethod = new MethodVisitor(Opcodes.ASM5, mv) {
public void visitCode() {
visitMethodInsn(
Opcodes.INVOKESTATIC,
"com/shihuan/field/SecurityCheckerField",
"getStartTime", "()Ljava/util/Date;", false);
super.visitCode();
}
public void visitInsn(int opcode) {
if ((opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) || opcode == Opcodes.ATHROW) {
visitVarInsn(Opcodes.ALOAD, 0);
visitMethodInsn(Opcodes.INVOKESTATIC, "com/shihuan/field/SecurityCheckerField", "checkCode", "(Lcom/shihuan/field/AccountField;)V", false);
}
super.visitInsn(opcode);
}
};
}
}
return newMethod;
}
};
cr.accept(cv, ClassReader.SKIP_DEBUG);
byte[] code = cw.toByteArray();
OutputStream fos = new FileOutputStream("D:/myworkspace/JavaAsm/bin/com/shihuan/field/AccountField.class");
fos.write(code);
fos.close();
}
}
分享到:
相关推荐
Java字节码实现AOP(面向切面编程)是一种在程序运行时动态插入代码的技术,它使得我们可以在不修改原有代码的情况下,增加新的功能或监控已有功能。在Java中,AOP通常通过代理模式和字节码操作来实现,如Spring AOP...
ASM是一个底层的Java字节码操控和分析框架,可以用来动态生成类或者增强已有类的功能。 **CGLIB的使用步骤**: 1. 引入依赖:在项目中引入CGLIB的依赖库,通常通过Maven或Gradle等构建工具添加。 2. 创建Enhancer...
Java字节码编辑器是一种工具,它允许开发者直接编辑Java程序编译后的`.class`文件,而不是反编译后再重新编译。这种编辑器对于理解、调试和优化Java代码非常有用,尤其是对于那些无法访问源代码或者需要进行底层操作...
通过深入了解这些结构,开发者可以更好地理解Java字节码的工作原理,从而优化代码执行效率,调试程序,甚至实现字节码级别的动态修改和插桩技术。这对于性能调优、AOP(面向切面编程)以及理解JVM的工作方式至关重要...
BCEL(Byte Code Engineering Library)是Java开发的一个重要工具,主要用于处理Java字节码。它为开发者提供了一种深入理解与操作Java类文件的底层机制,允许分析、创建、修改和优化字节码。在软件工程中,BCEL在...
CGlib库利用ASM库(一个底层的Java字节码操作和分析框架)来生成和修改字节码。通过这种方式,开发者可以在程序运行时动态地创建新的类或修改现有类的行为,而无需重新编译源代码。 **动态代理** CGlib常用于实现...
3. **创建 MethodVisitor**:针对每个方法,我们需要创建一个 MethodVisitor 对象,通过重写其方法,实现在字节码级别插入新的指令。 4. **插入切面代码**:在适当的位置,比如方法调用前(Advice Before)和调用后...
Java字节码是Java虚拟机(JVM)执行程序的核心组成部分,它是一种低级的、平台无关的指令集。ASM是一个开源的Java字节码操控和分析框架,它可以直接用来生成和修改Java类文件,是Java动态代理和字节码增强技术的重要...
Java字节码增强技术是Java开发中的一种高级技巧,它允许开发者在程序运行时动态修改类的字节码,从而实现一些特殊的功能,比如AOP(面向切面编程)、性能监控、事务管理等。协程是一种轻量级的线程,它在执行过程中...
6. **字节码操纵**:Java字节码操纵库,如ASM、BCEL、CGLIB等,允许程序员在运行时动态修改类的字节码,实现AOP(面向切面编程)和代码注入等功能。 7. **安全性**:Java的字节码验证机制确保了字节码的安全性,...
Java字节码是Java平台的一种独特特性,它使得Java程序具有跨平台的兼容性和高度的安全性。字节码是Java虚拟机(JVM)能够理解的低级指令集,每条字节码指令对应一种特定的操作。在Java中,我们可以使用字节码技术来...
Java字节码工程工具包,通常被称为Javassist,是一个开源项目,专为Java开发者提供了一种方便的方式来处理和操作字节码。Javassist在Java应用开发中扮演着重要的角色,尤其是在动态代理、AOP(面向切面编程)以及...
ASM Java字节码操作框架PPT,结合已有AOP实现方法,对比所有对Java字节码操作方法做比较
通过这样的方式,ASM可以帮助我们深入理解Java字节码,同时也为我们提供了强大的工具来实现动态代码生成,这对于实现诸如AOP这样的高级编程模式至关重要。在实际项目中,ASM通常与其他工具结合使用,如CGLIB或Byte...
2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码操作生成子类实现动态代理。 现在,我们转向"AOP(面向切面编程)"。AOP是Spring框架的核心特性之一,它允许我们将关注点(如日志、事务管理、安全检查...
对于有具体实现类的情况,可能需要使用其他AOP框架,比如Spring AOP,它基于字节码操作,能处理接口和类,功能更加强大和灵活。 总之,Java动态代理提供了一种在运行时创建代理类并实现AOP的方法,它可以帮助我们...
Java字节码操作库BCEL(Byte Code Engineering Library)是一个强大的工具,用于分析、修改和创建Java类文件。它是Apache软件基金会的Jakarta项目的一部分,为开发者提供了对字节码的底层控制,使得开发者能够在运行...
BCEL(Byte Code Engineering Library)是Java平台上的一款开源库,主要用于处理Java字节码。它提供了对字节码的解析、创建、修改和分析的能力,使得开发者能够深入理解并操作Java类文件。BCEL在很多场合下被用作...