`
baihongsheng
  • 浏览: 13375 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类

AOP:ASM直接为类方法添加前拦截执行(区别于无损方式)

    博客分类:
  • ASM
阅读更多

//最近学习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();

  }

//完成

分享到:
评论

相关推荐

    spring aop切面拦截指定类和方法实现流程日志跟踪

    在上述代码中,我们定义了一个名为`SpringAopLog`的切面类,并通过注解指定了哪些方法会在目标方法执行前后被调用。在`afterReturn`方法中,根据不同的方法名来记录不同的日志信息。 #### 四、总结 通过Spring AOP...

    aop:aspect

    在这个例子中,`loggingAspect`是一个切面,引用了名为`loggingService`的bean,该bean包含了三个不同的通知方法,分别在目标方法执行前、执行后返回正常结果时以及执行过程中被调用。 `pointcut`属性定义了通知所...

    AOP 的利器:ASM 3_0 介绍

    AOP 的利器:ASM 3_0 介绍,很好的书

    ASM函数监听实现(三)拦截注入函数的参数值 (函数执行前)

    本篇文章将深入探讨如何使用ASM库来实现函数监听,特别是如何在函数执行前拦截并改变其参数值。 首先,我们需要理解ASM库的基本用法。ASM提供了一套API,可以直接生成或修改字节码。在Java中,每个类都是以字节码...

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    aop切面拦截单个方法实例

    通过配置Spring的AOP配置,我们可以指定哪些类或方法需要被这个切面拦截。这样,无需在每个业务方法中添加日志代码,就能实现全局的日志记录。 总之,AOP是Spring框架的重要特性,它提供了一种有效管理和组织横切...

    spring AOP拦截方法小示例

    在Spring框架中,AOP(面向切面...同时,这也为我们提供了一个模板,可以轻松地为其他需要拦截的方法添加类似的功能。记住,合理使用AOP能够提高代码的可维护性和复用性,避免了在业务逻辑中穿插大量与业务无关的代码。

    AOP 的利器 ASM 3.0

    它可以被用来直接修改`.class`文件,也可以在类加载到Java虚拟机(JVM)前实时改变类的行为。通过使用ASM,开发人员能够轻松地生成新的类或者对现有的类进行增强,这在很多现代框架中都有所应用,比如Hibernate和...

    Castle AOP 对类方法调用的拦截示例Deom(可运行)

    在这个"Castle AOP 对类方法调用的拦截示例Demo"中,我们将深入探讨如何使用Castle框架来实现AOP的拦截功能,并且这个示例是可运行的,这意味着你可以直接运行代码来理解其工作原理。 首先,让我们了解一下Castle....

    .net中attribute实现方法调用拦截(就是aop)

    动态代理可以在编译时或运行时创建代理类,这些代理类会包裹目标方法,并在调用目标方法前/后执行额外的逻辑。 描述中提到了`context`,在AOP场景下,通常指的是拦截器执行时上下文信息。这可能包括方法参数、方法...

    spring MVC AOP注解方式如何拦截controller 例子

    现在,我们可以在切面类中添加通知方法,例如一个`@Before`前置通知,用于在Controller方法执行前进行操作。 ```java @Before("controllerMethods()") public void logBeforeControllerMethod(JoinPoint joinPoint...

    java aop拦截方法类前后添加日志

    本话题聚焦于如何使用Java AOP来在方法执行前后插入日志记录,这有助于提升代码的可读性和可维护性,同时提供运行时的调试信息。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了特定的关注...

    springaop拦截controller日志

    "springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    spring aop注解方式、xml方式示例

    使用`<aop:before>`、`<aop:after>`、`<aop:after-returning>`、`<aop:after-throwing>`和`<aop:around>`元素定义不同类型的的通知,例如: ```xml <aop:aspect id="loggingAspect" ref="loggingAspectBean"> <aop...

    spring aop 拦截实例

    - `@Before`:前置通知,在目标方法执行前运行。 - `@After`:最终通知,无论目标方法是否正常结束,都会执行。 - `@AfterReturning`:返回后通知,只有在目标方法正常结束时执行。 - `@AfterThrowing`:异常后...

    Castle AOP 系列(二):对接口方法调用的拦截(可运行源码)

    拦截器是执行特定任务的类,而代理则是被拦截对象的包装器,它在调用实际方法之前和之后执行拦截器的逻辑。 **1. 创建拦截器** 在 Castle AOP 中,我们可以自定义拦截器类,实现 `IInterceptor` 接口。这个接口...

    AOP四种配置方式demo

    切入点表达式(Pointcut Expression)通常写在`<aop:pointcut>`中,用于指定哪些方法会被通知拦截。 3. **编程式**: 编程式AOP允许我们在代码中直接创建和管理切面。我们可以通过`AspectJ`提供的API来创建切面类...

    AOP的相关概念

    - **代理模式**:利用动态代理技术为已有类创建代理对象,并在代理对象中添加额外的功能。 - **静态代理**:在编译阶段就已经确定好代理类的实现。 - **动态代理**:在运行时动态创建代理对象。 #### 动态代理回顾 ...

Global site tag (gtag.js) - Google Analytics