首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用标准java功能拦截方法调用(没有AspectJ等)?

要使用标准Java功能拦截方法调用,而不使用AspectJ等第三方库,您可以使用Java的动态代理。动态代理允许您在运行时创建代理对象,以拦截方法调用并在执行原始方法之前或之后添加自定义逻辑。以下是如何使用动态代理的示例:

  1. 创建一个接口,表示要拦截的方法。
代码语言:java
复制
public interface MyInterface {
    void myMethod();
}
  1. 创建一个实现接口的类。
代码语言:java
复制
public class MyInterfaceImpl implements MyInterface {
    @Override
    public void myMethod() {
        System.out.println("Method called");
    }
}
  1. 创建一个代理工厂,用于生成代理对象。
代码语言:java
复制
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyProxyFactory {
    public static <T> T createProxy(Class<T> interfaceClass, T target) {
        return (T) java.lang.reflect.Proxy.newProxyInstance(
                interfaceClass.getClassLoader(),
                new Class<?>[]{interfaceClass},
                new MyInvocationHandler(target)
        );
    }

    private static class MyInvocationHandler implements InvocationHandler {
        private final Object target;

        public MyInvocationHandler(Object target) {
            this.target = target;
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Before method call");
            Object result = method.invoke(target, args);
            System.out.println("After method call");
            return result;
        }
    }
}
  1. 使用代理工厂创建代理对象并调用方法。
代码语言:java
复制
public class Main {
    public static void main(String[] args) {
        MyInterface myInterface = new MyInterfaceImpl();
        MyInterface proxy = MyProxyFactory.createProxy(MyInterface.class, myInterface);
        proxy.myMethod();
    }
}

在这个示例中,当调用proxy.myMethod()时,代理对象会在原始方法执行之前和之后添加自定义逻辑。您可以根据需要修改MyInvocationHandler类中的invoke方法,以添加您需要的拦截逻辑。

请注意,动态代理的性能可能不如AspectJ等第三方库。如果您需要更高级的功能和性能,可以考虑使用这些库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 诊断工具 Arthas 常见命令使用和实战(排查函数调用异常、热更新、调用方法函数、查看堆栈调用)

可以用来查看线程,内存,GC和运行时状态,查看入参/返回值/异常,快速定位应用的热点,生成火焰图等功能,帮助更快排查疑难问题。本文主要讲述常见命令的使用。...tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。...使用tt命令获取到spring context tt即 TimeTunnel,它可以记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。...使用tt命令从调用记录里获取到spring context tt -i 1000 -w 'target.getApplicationContext()' 获取spring bean,并调用函数 tt...排查HTTP请求返回401 请求接口没有权限的时候一般就返回401 Unauthorized。 401通常是被权限管理的Filter拦截了,那么到底是哪个Filter处理了这个请求,返回了401?

3.1K40

Spring MVC系列-(5) AOP

这个点可以是类的某个方法调用前、调用后、方法抛出异常后。 2. 通知(Advice) 在特定的连接点,AOP框架执行的动作。...()方法,在intercept()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能;通过调用MethodProxy.invokeSuper()方法,我们将调用转发给原始对象,具体到本例...增强Bean的调用过程 上面对AOP流程进行了梳理,通过代码分析了如何代理生成增强的Bean。这部分介绍在调用增强Bean的方法时,proxy对象是如何拦截方法调用的。...在得到拦截链之后,如果没有拦截器链,直接执行目标方法;如果有拦截器链,把需要执行的目标对象,目标方法拦截器链信息传入创建一个 CglibMethodInvocation 对象,并调用 mi.proceed...里新增了打印日志的内容——这表明 AspectJ 在编译时“自动”编译得到了一个新类,这个新类增强了原有的 SayHelloService.java 类的功能,因此 AspectJ 通常被称为编译时增强的

19910
  • 【JavaEE进阶】Spring AOP

    比如说我们在做后台系统时,除了登录和注册几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器都需要先验证用户登录的状态,此时我们应该如何处理呢?...动态代理可以用于许多场景,如拦截方法调用、记录日志、实现事务管理。通过使用动态代理,你可以在不修改原始对象的情况下,增加或改变其行为。 AOP的实现原理可以通过动态代理来实现。...在运行时,当方法调用时,JDK动态代理会拦截方法调用,并在必要的时候执行切面中定义的通知逻辑。...当目标对象没有实现接口时,CGLIB动态代理通过创建目标对象的子类,并重写父类中的方法来实现代理功能。在AOP中,切面被表示为一个继承了目标对象的子类,切面的通知逻辑被插入到子类相应的方法中。...如果目标对象实现了接口,则可以使用JDK动态代理;如果目标对象没有实现接口,则需要使用CGLIB动态代理。

    23230

    工作三年,小胖问我什么是 Spring 的 IoC 和 AOP?真的菜!

    比如统一的日志处理模块、授权验证模块都可以使用 AOP 很轻松的处理。...「通知(advice)」:拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类: 前置(Before):在目标方法调用之前调用通知功能; 后置(After):在目标方法完成之后调用通知...:通知包裹了被通知的方法,在被通知的方 法调用之前和调用之后执行自定义的行为 「切点(pointcut)」:对连接点进行拦截的定义,它会匹配通知所要织入的一个或多个连接点。...场景中,日志功能就是这个抽象,它定义了你要对拦截方法做什么?「切面是通知和切点的结合。...,引入可以在运行期为类动态地添加一些方法或字段 AOP 的配置方式 Spring 提供了 Java API、@AspectJJava)注解以及 XML标签三种 AOP 配置方式。

    26520

    似懂非懂的 AspectJ

    ,除了调用房东的 rent 方法之外,还调用了 publishAd 和 agencyFee 两个方法。...1.2 动态代理 动态代理讲究在不改变原类原方法的情况下,增强目标方法功能,例如,大家平时使用的 Spring 事务功能,在不改变目标方法的情况下,就可以通过动态代理为方法添加事务处理能力。...从官网我们可以看到 AspectJ 的定位: 基于 Java 语言的面向切面编程语言。 兼容 Java。 易学易用。 使用 AspectJ 时需要使用专门的编译器 ajc。...2.2 Spring AOP Spring AOP 在开发的时候,其实也使用AspectJ 中的注解,像我们平时使用的 @Aspect、@Around、@Pointcut ,都是 AspectJ...里边提供的,但是 Spring AOP 并未借鉴 AspectJ 的编译时增强,Spring AOP 没有使用 AspectJ 的编译器和织入器,Spring AOP 还是使用了运行时增强。

    34420

    SpringAOP学习–SpringAOP简介及原理

    JDK动态代理使用需要定义一个代理实例的调用拦截处理器InvocationHandler,反射执行目标方法,之前前后可以加入一些额外的代码实现增强。...一个类需要进行多次切面,如何有效组织多个切面。 SpringAOP介绍 为了标准化AOP,Spring引入了一套AOP顶级API– AOP联盟,用来定义和使用AOP。...AOP联盟 AOP联盟,一群热爱技术的人觉得AOP思想不错,于是打算促进和标准化AOP,定制了一套标准,推动AOP和JAVA发展。 那么AOP联盟的标准是什么呢?...1.直接配置Advisor 实现Advisor接口,定义拦截器和拦截规则(切点) 2.间接配置Advisor 使用Aspectj jar包提供的注解定义AOP配置,由Spring解析配置生成Advisor...proceed方法,会链式调用拦截器,执行所有的切面代码。

    30620

    详解Java中高级程序员必须要掌握的Spring Aop(上篇)

    Spring AOP 目前只支持方法级别的连接点拦截,通知必须加在 Spring 容器管理的 bean 方法上,属性级别的拦截目前还没有实现。...通过自动代理,如果Spring 确定一个bean 由一个或多个切面通知,它将自动为该 bean 生成一个代理来拦截方法调用,并确保根据需要执行通知。...3.2 使用 Java 配置开启 @AspectJ 支持 使用Java @Configurtion 配置开启 @AspectJ 支持,你需要在Java配置类上添加@EnableAspectJAutoProxyl...7.4 处理参数 我们在前面提到过,我们将描述如何使用在 Spring AOP 和 AspectJ 中一致工作的参数来编写 proceed() 调用。...使用的demo代码基本都是官方文档中的代码片段,在笔者的下一篇文章中将使用基于 SpringBoot 的项目,讲解利用Spring AOP 特性实现用户登录日志记录,接口调用耗时日志记录和一些操作权限验证等功能

    1.5K30

    切面执行顺序如何控制?

    Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy...Spring AOP 已经集成了 AspectJAspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。...Spring AOP 已经集成了 AspectJAspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。...AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单, 如果我们的切面比较少,那么两者性能差异不大。...环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法 多个切面的执行顺序如何控制?

    52820

    《Spring 手撸专栏》第 12 章:炉火纯青,基于JDK和Cglib动态代理,实现AOP核心功能

    那么我们就需要先来实现一个可以代理方法的 Proxy,其实代理方法主要是使用方法拦截器类处理方法调用 MethodInterceptor#invoke,而不是直接使用 invoke 方法中的入参 Method...除了以上的核心功能实现,还需要使用到 org.aspectj.weaver.tools.PointcutParser 处理拦截表达式 "execution(* cn.bugstack.springframework.test.bean.IUserService...,同时这个类主要是对 aspectj 包提供的表达式校验方法使用。...invoke 方法中主要处理匹配的方法后,使用用户自己提供的方法拦截实现,做反射调用 methodInterceptor.invoke 。...AOP 的功能实现目前还没有与 Spring 结合,只是对切面技术的一个具体实现,你可以先学习到如何处理代理对象、过滤方法拦截方法,以及使用 Cglib 和 JDK 代理的区别,其实这与的技术不只是在

    28920

    Spring AOP

    有这样⼀个场景,当我们在做后台系统时,除了登录和注册几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器( Controller)都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?...那有没有简单的处理方案呢?答案是有的,对于这种功能统⼀,且使用的地方较多的功能,就可以考虑 AOP来统⼀处理了。...除了统⼀的用户登录判断之外,AOP 还可以实现: 统⼀日志记录:AOP可以在方法调用前后记录日志信息,如方法名、参数、返回值,从而实现统一的日志记录,方便系统的监控和调试。...事务的开启和提交:AOP可以用于在方法调用前后开启和提交事务,从而实现统一的事务管理,保障数据的一致性。...) 定义通知的实现 接下来我们使用 Spring AOP 来实现⼀下 AOP 的功能,完成的目标是拦截所有 UserController 里面的方法,每次调用 UserController 中任意⼀个方法

    17350

    从一个Aspectj织入失效问题的解决说起

    提供了基于Aspectj的自定义枚举AOP拦截jar包,但使用使用时编织不进去,让帮瞅瞅。 这,应该不难才对呀,日志AOP不是经常写么? 很多实现方式的哇~ 我:为啥不搞个spring 组件包?...答:不行,组内项目基本没有依托spring的,都是纯Java项目,不带任何框架~ 我:黑人问号~ 我:搞个动态代理?...定义注解 先搞一个注解LogAnnotation , 供使用方标注需要拦截方法,也给Aspectj提供切点: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME...,其注释关注下,JSR-xxx ,表示这是一个Java规范,是标准,只能这么写。...而方法入参中的Instrumentation,是JVM调用方法时传入的,并且在方法内部,给其添加了一个字节码转换器 看到这里,应该就大概其明白其工作原理了。

    1.2K10

    Spring5参考指南:SpringAOP简介

    事务管理是企业Java应用程序中横切关注点的一个很好的例子。在SpringAOP中,方面是通过使用常规类(基于模式的方法)或使用@Aspect注解(@Aspectj样式)注解的常规类来实现的。...因为SpringAOP是通过使用运行时代理实现的,所以这个对象始终是一个代理对象。 AOP代理:由AOP框架创建的用于实现aspect contracts(通知方法执行)的对象。...Spring AOP简介 Spring AOP是纯Java实现的。不需要特殊的编译过程。 SpringAOP目前只支持方法上面的连接点,并没有实现字段连接。...如果要实现这样的功能可以考虑使用AspectJ。...Around advice:环绕连接点(如方法调用)的通知。这是最有力的通知。around通知可以在方法调用前后执行自定义行为。

    33830

    Spring读源码系列之AOP--01---aop基本概念扫盲---上

    这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。...最后需要注意的是:RegexpMethodPointcutAdvisor没有提供不匹配的正则表达式注入方法,即没有excludedPatterns注入,如果需要该功能请还是使用JdkRegexpMethodPointcut...= "args()"; // 所有没有入参的方法会被拦截。...> getConstructor();(Spring没有提供任何实现类) 这就是AOP联盟为我们提供的所有的类,它里面全部是接口(那个异常类除外),相当于它定义了一套AOP的标准类。...下面的所有类,都是专门为了使用@Aspect的方式去服务的,毕竟AOP功能是Spring自己实现的,而不是依赖于AspectJ这个组件的

    76710

    Spring(4)——面向切面编程(AOP模块)

    ---- 使用注解来开发 Spring AOP 使用注解的方式已经逐渐成为了主流,所以我们利用上面的例子来说明如何用注解来开发 Spring AOP 第一步:选择连接点 Spring 是方法级别的 AOP...第二步:创建切面 选择好了连接点就可以创建切面了,我们可以把切面理解为一个拦截器,当程序运行到连接点的时候,被拦截下来,在开头加入了初始化的方法,在结尾也加入了销毁的方法而已,在 Spring 中只要使用...,下面来列举一下 Spring 中的 AspectJ 注解: 注解 说明 @Before 前置通知,在连接点方法调用 @Around 环绕通知,它将覆盖原有方法,但是允许你通过反射调用原有方法,后面会讲...@After 后置通知,在连接点方法调用 @AfterReturning 返回通知,在连接点方法执行并正常返回后调用,要求连接点方法在执行过程中没有发生异常 @AfterThrowing 异常通知,...当连接点方法异常时调用 有了上表,我们就知道 before() 方法是连接点方法调用调用方法,而 after() 方法则相反,这些注解中间使用了定义切点的正则式,也就是告诉 Spring AOP

    66460

    Spring实战4—面向切面编程主要内容

    Spring AOP技术可以完成简单的函数级拦截,例如构造函数、属性修改等等,但是如果需要实现更复杂的AOP功能,则应使用AspectJ框架。...如下图所示,调用者跟代理类直接联系,代理类拦截函数调用,然后执行切面逻辑之后再调用真正的目标对象的方法。 ? 基于代理机制实现AOP 只有在应用需要使用被代理bean时,Spring才会创建代理对象。...特别要记住:Spring中的AspectJ自动代理机制本质上还是Spring中基于代理的切面,因此,虽然你使用了@Aspect注解,但是仍然仅能支持函数调用级别的拦截。...在环绕通知中必须调用proceed()方法,如果没有,则应用的执行会阻塞在通知方法中。...AspectJ注解创建一个切面,用于记录每个track被调用的次数,同样可以使用XML完成这个功能

    99240

    Spring AOP 和 动态代理技术

    常用的场景包括记录日志、异常处理、性能监控、安全控制(例如拦截器),总结起来就是,凡是想对当前功能做变更,但是又不想修改源代码的情况下,都可以考虑是否可以用 AOP 实现。...使用方式不是本文介绍的重点,下面仅演示最简单最基础的使用,实现对调用方法进行耗时计算,并打印出来。 环境说明: JDK 1.8 ,Spring mvc 版本 4.3.2.RELEASE 1....dowork 方法的时候,实际在代理类中是调用了 JdkProxy (也就是我们实现的这个代理拦截器)的 invoke 方法,接着执行我们实现的 invoke 方法,也就执行了我们加入的逻辑,从而实现了切面编程的需求...厉害了吧,不管有没有接口,凡是类都可以被继承,拥有这样的特点,原则上来说,它可以对任何类进行代码拦截,从而达到切面编程的目的。...标准的 Spring MVC 框架,一般都是一个服务接口类对应一个实现类,所以根据Spring AOP 的判断逻辑,应该大部分情况下都是使用的 JDK 动态代理模式。

    70980
    领券