//最近学习ASM的一点总结
//首先这种方式会更新原来的class文件,总体感觉不是很好,不过其思路很是可以借鉴!!
//1、为AccountAsm类的operation方法添加 安全检查方法 ,在执行operation前执行 SecurityChecker.checkSecurity
//首先 建立SecurityChecker 和 AccountAsm 类
--------------------------------------------------------------------------------
package com.security;
public class SecurityChecker {
public static void checkSecurity() {
System.out.println("SecurityChecker.checkSecurity ...");
//TODO real security check
}
}
--------------------------------------------------------------------------------
package com.aop;
public class AccountAsm {
public void operation()
{
System.out.println("operation...");
//TODO real operation
}
}
--------------------------------------------------------------------------------
//2、然后 实现一个 methodAdapter 类,用于 修改方法
package com.aop;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class AddSecurityCheckMethodAdapter extends MethodAdapter {
public AddSecurityCheckMethodAdapter(MethodVisitor mv) {
super(mv);
}
//com/security/SecurityChecker 此点很总要,不能写成com.security.SecurityChecker
public void visitCode() {
visitMethodInsn(Opcodes.INVOKESTATIC, "com/security/SecurityChecker",
"checkSecurity", "()V");
}
}
}
//3、再然后实现一个ClassAdapter 用于判断 何时修改AccountAsm 类方法
package com.aop;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
public class AddSecurityCheckClassAdapter extends ClassAdapter
{
public String enhancedSuperName;
public AddSecurityCheckClassAdapter(ClassVisitor cv) {
//Responsechain 的下一个 ClassVisitor,这里我们将传入 ClassWriter,
// 负责改写后代码的输出
super(cv);
}
// 重写 visitMethod,访问到 "operation" 方法时,
// 给出自定义 MethodVisitor,实际改写方法内容
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
MethodVisitor mv = cv.visitMethod(access, name, desc, signature,exceptions);
MethodVisitor wrappedMv = mv;
if (mv != null) {
// 对于 "operation" 方法
if (name.equals("operation")) {
// 使用自定义 MethodVisitor,实际改写方法内容
wrappedMv = new AddSecurityCheckMethodAdapter(mv);
} }
return wrappedMv;
}
}
//4、读取原来的AccountAsm.class文件,并为operation方法前添加SecurityChecker.checkSecurity(),然后 生产新的class文件
public static void main(String[] args) throws Exception {
ClassReader cr = new ClassReader("com.aop.AccountAsm");
ClassWriter cw = new ClassWriter(true);
ClassAdapter classAdapter = new AddSecurityCheckClassAdapter(cw);
cr.accept(classAdapter, true);
byte[] data = cw.toByteArray();
String classPath = (
AccountAsm.class.getResource("/").toString() +
AccountAsm.class.getCanonicalName().replace(".", File.separator)+
".class"
).substring(6)
;
File file = new File(classPath);
FileOutputStream fout = new FileOutputStream(file);
fout.write(data);
fout.close();
}
//完成
分享到:
相关推荐
在上述代码中,我们定义了一个名为`SpringAopLog`的切面类,并通过注解指定了哪些方法会在目标方法执行前后被调用。在`afterReturn`方法中,根据不同的方法名来记录不同的日志信息。 #### 四、总结 通过Spring AOP...
在这个例子中,`loggingAspect`是一个切面,引用了名为`loggingService`的bean,该bean包含了三个不同的通知方法,分别在目标方法执行前、执行后返回正常结果时以及执行过程中被调用。 `pointcut`属性定义了通知所...
AOP 的利器:ASM 3_0 介绍,很好的书
本篇文章将深入探讨如何使用ASM库来实现函数监听,特别是如何在函数执行前拦截并改变其参数值。 首先,我们需要理解ASM库的基本用法。ASM提供了一套API,可以直接生成或修改字节码。在Java中,每个类都是以字节码...
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
通过配置Spring的AOP配置,我们可以指定哪些类或方法需要被这个切面拦截。这样,无需在每个业务方法中添加日志代码,就能实现全局的日志记录。 总之,AOP是Spring框架的重要特性,它提供了一种有效管理和组织横切...
在Spring框架中,AOP(面向切面...同时,这也为我们提供了一个模板,可以轻松地为其他需要拦截的方法添加类似的功能。记住,合理使用AOP能够提高代码的可维护性和复用性,避免了在业务逻辑中穿插大量与业务无关的代码。
它可以被用来直接修改`.class`文件,也可以在类加载到Java虚拟机(JVM)前实时改变类的行为。通过使用ASM,开发人员能够轻松地生成新的类或者对现有的类进行增强,这在很多现代框架中都有所应用,比如Hibernate和...
在这个"Castle AOP 对类方法调用的拦截示例Demo"中,我们将深入探讨如何使用Castle框架来实现AOP的拦截功能,并且这个示例是可运行的,这意味着你可以直接运行代码来理解其工作原理。 首先,让我们了解一下Castle....
动态代理可以在编译时或运行时创建代理类,这些代理类会包裹目标方法,并在调用目标方法前/后执行额外的逻辑。 描述中提到了`context`,在AOP场景下,通常指的是拦截器执行时上下文信息。这可能包括方法参数、方法...
现在,我们可以在切面类中添加通知方法,例如一个`@Before`前置通知,用于在Controller方法执行前进行操作。 ```java @Before("controllerMethods()") public void logBeforeControllerMethod(JoinPoint joinPoint...
本话题聚焦于如何使用Java AOP来在方法执行前后插入日志记录,这有助于提升代码的可读性和可维护性,同时提供运行时的调试信息。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注...
"springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
使用`<aop:before>`、`<aop:after>`、`<aop:after-returning>`、`<aop:after-throwing>`和`<aop:around>`元素定义不同类型的的通知,例如: ```xml <aop:aspect id="loggingAspect" ref="loggingAspectBean"> <aop...
- `@Before`:前置通知,在目标方法执行前运行。 - `@After`:最终通知,无论目标方法是否正常结束,都会执行。 - `@AfterReturning`:返回后通知,只有在目标方法正常结束时执行。 - `@AfterThrowing`:异常后...
拦截器是执行特定任务的类,而代理则是被拦截对象的包装器,它在调用实际方法之前和之后执行拦截器的逻辑。 **1. 创建拦截器** 在 Castle AOP 中,我们可以自定义拦截器类,实现 `IInterceptor` 接口。这个接口...
切入点表达式(Pointcut Expression)通常写在`<aop:pointcut>`中,用于指定哪些方法会被通知拦截。 3. **编程式**: 编程式AOP允许我们在代码中直接创建和管理切面。我们可以通过`AspectJ`提供的API来创建切面类...
- **代理模式**:利用动态代理技术为已有类创建代理对象,并在代理对象中添加额外的功能。 - **静态代理**:在编译阶段就已经确定好代理类的实现。 - **动态代理**:在运行时动态创建代理对象。 #### 动态代理回顾 ...