logo

Java 静态代理、Java动态代理与CGLIB动态代理的深入理解

作者:很酷cat2024.01.05 14:30浏览量:9

简介:本文将深入探讨Java静态代理、Java动态代理和CGLIB动态代理的概念、工作原理及其应用。我们将通过代码实例来帮助理解,并分析它们的优缺点和适用场景。

在Java编程中,代理是一种设计模式,用于在客户端和目标对象之间插入一个中间层,以实现额外的操作或增强现有功能。代理模式可以分为静态代理和动态代理两种。本文将详细介绍Java静态代理、Java动态代理和CGLIB动态代理的概念、工作原理及其应用。
一、Java静态代理
Java静态代理是指在程序编译时就确定了代理类的类型,即在编写代码时需要手动创建代理类。静态代理的实现需要手动编写一个接口和一个实现类,以及一个代理类。代理类实现了接口,并调用实现类的方法,同时可以在调用前后添加额外的逻辑。
下面是一个简单的Java静态代理的示例代码:

  1. // 定义接口
  2. public interface MyInterface {
  3. void doSomething();
  4. }
  5. // 实现接口
  6. public class MyImpl implements MyInterface {
  7. @Override
  8. public void doSomething() {
  9. System.out.println("Doing something...");
  10. }
  11. }
  12. // 代理类
  13. public class MyProxy implements MyInterface {
  14. private MyInterface myInterface;
  15. public MyProxy(MyInterface myInterface) {
  16. this.myInterface = myInterface;
  17. }
  18. @Override
  19. public void doSomething() {
  20. System.out.println("Before doing something...");
  21. myInterface.doSomething();
  22. System.out.println("After doing something...");
  23. }
  24. }

在这个例子中,我们定义了一个接口MyInterface,一个实现类MyImpl,以及一个代理类MyProxyMyProxy实现了MyInterface接口,并在doSomething()方法中添加了额外的逻辑。使用MyProxy作为代理对象调用doSomething()方法时,会先输出“Before doing something…”,然后调用MyImpldoSomething()方法,最后输出“After doing something…”。
二、Java动态代理
Java动态代理是指在运行时动态创建代理类。通过使用Java提供的Proxy类和InvocationHandler接口,可以在运行时动态地创建一个实现了指定接口的代理对象。与静态代理相比,动态代理更加灵活,因为可以在运行时决定要为哪些接口创建代理对象。
下面是一个简单的Java动态代理的示例代码:
java // 定义接口 public interface MyInterface { void doSomething(); } // 实现接口 public class MyImpl implements MyInterface { @Override public void doSomething() { System.out.println("Doing something..."); } } // 创建InvocationHandler实现类 public class MyInvocationHandler implements InvocationHandler { private 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 calling method..."); Object result = method.invoke(target, args); System.out.println("After calling method..."); return result; } }在这个例子中,我们定义了一个接口MyInterface,一个实现类MyImpl,以及一个实现了InvocationHandler接口的类MyInvocationHandler。在MyInvocationHandler中,我们重写了invoke()方法,该方法会在代理对象的方法被调用时执行。在invoke()方法中,我们可以在调用目标对象的方法前后添加额外的逻辑。然后我们使用Proxy.newProxyInstance()方法创建了一个实现了MyInterface接口的代理对象。该方法需要传入一个实现了InvocationHandler接口的类的实例作为参数。使用该代理对象调用doSomething()方法时,会先输出“Before calling method…”,然后调用MyImpldoSomething()方法,最后输出“After calling method…”。
三、CGLIB动态代理
CGLIB是一个高性能的代码生成库,可以在运行时动态地扩展类和实现接口。CGLIB通过字节码操作库ASM动态生成子类来实现代理。与

相关文章推荐

发表评论