欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > 手写JDK动态代理实现AOP

手写JDK动态代理实现AOP

2024/11/16 3:50:41 来源:https://blog.csdn.net/m0_71751187/article/details/143669770  浏览:    关键词:手写JDK动态代理实现AOP

AOP底层?

AOP(Aspect Oriented Programming,面向切面编程)在 Java 中的实现有多种方式,其中使用 JDK 动态代理和 CGLIB 代理较为常见。

当你的应用程序遵循面向接口编程的原则时,JDK 动态代理是一个自然的选择。如果你的目标对象实现了一个或多个接口,并且你希望在不修改目标对象代码的情况下为其添加额外的功能,如日志记录、性能监测、安全检查等,那么可以使用 JDK 动态代理。

对象如果实现了接口就是用jdk动态代理,否则使用cglib

使用JDK动态代理实现环绕通知

1.Proxy.newProxyInstance()

这个方法的作用就是创建一个类的动态代理对象

三个参数:

ClassLoader loader:一个ClassLoader对象,用于定义代理对象的类加载器。通常可以使用目标对象的类加载器,以便代理对象能够访问目标对象所在的类路径。简称类加载器
Class<?>[] interfaces:一个Class对象的数组,表示代理对象要实现的接口列表。通过指定这些接口,确保代理对象可以像实现了这些接口的真实对象一样被使用。
InvocationHandler h:一个InvocationHandler对象,它是代理对象的调用处理程序。当在代理对象上调用方法时,这个处理程序会被调用

重点:InvocationHandler这个对象就是调用代理对象的方法时会执行里面的invoke()方法

2.InvocationHandler

因为调用代理对象的方法时会执行里面的invoke方法

因此我们需要实现这个接口去重写里面的方法去实现环绕通知。

这里我们使用OrderHandler实现InvocationHandler重写invoke方法实现环绕通知

public class OrderHandler implements InvocationHandler {private Object object;public OrderHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("============环绕通知前:执行一些前置操作==========");Object invoke = method.invoke(object, args);System.out.println("============环绕通知后:执行一些后置操作==========");return invoke;}
}
method.invoke(object, args):这个方法的作用是在代理对象的方法被调用时,通过反射机制调用被代理对象的相应方法。

3.所有代码

——接口以及实现类

public interface OrderService{void add();void get();void del();void update();
}
public class OrderServiceImpl implements OrderService{@Overridepublic void add() {System.out.println("添加商品方法add()");}@Overridepublic void get() {System.out.println("获取商品方法get()");}@Overridepublic void del() {System.out.println("删除商品方法del()");}@Overridepublic void update() {System.out.println("更新商品方法update()");}
}

——OrderHandler

public class OrderHandler implements InvocationHandler {private Object object;public OrderHandler(Object object){this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("============环绕通知前:执行一些前置操作==========");Object invoke = method.invoke(object, args);System.out.println("============环绕通知后:执行一些后置操作==========");return invoke;}
}

——main方法

使用newProxyInstance()方法创建OrderService的动态代理类,参数:类加载器、接口列表、InvocationHandler

public class main {public static void main(String[] args) {OrderService orderService = new OrderServiceImpl();OrderService proxyInstance =(OrderService)Proxy.newProxyInstance(orderService.getClass().getClassLoader(),orderService.getClass().getInterfaces(),new OrderHandler(orderService));System.out.println("使用动态代理:");proxyInstance.add();proxyInstance.del();}
}

结果

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com