JDK的动态代理
发布日期:2021-05-18 05:30:27 浏览次数:16 分类:精选文章

本文共 1996 字,大约阅读时间需要 6 分钟。

JDBC代理模式是实现远程调用或对业务逻辑抽象化的常用解决方案。 通过创建代理对象,可以将业务逻辑的实现与调用逻辑分开,提升系统的可扩展性和灵活性。 在本次实践中,我们通过Java反射机制实现了代理模式。

业务接口service中定义了两个方法:

  • doSome(int a, String b):根据输入参数计算结果。
  • doOther():执行无返回的业务操作。

目标实现类serviceImple实现了上述接口,即负责具体执行业务逻辑。

委托类ProxyEntrust采用了传统的InvocationHandler实现方式。 代理对象的命名规则为$+proxy+数字,这有助于区分不同的代理实例。

代理创建流程如下:

  • 创建目标对象并注入委托类。
  • 使用ReflectionAPI通过类加载器创建动态代理对象。
  • 调用代理对象的方法时,委托类的invoke方法会被触发。
  • 代理对象的方法执行流程为:

    • invoke获取目标方法。
    • method.invoke(target, args)执行目标方法。
    • 返回结果。

    通过实践发现,代理对象的名称不仅包含确定性部分,还包含随机数字,以保证唯一性。 代理实现中,目标对象通过构造器注入,这种方式确保了灵活性。

    代码示例如下:

    public interface service {
    String doSome(int a, String b);
    void doOther();
    }
    public class serviceImple implements service {
    @Override
    public String doSome(int a, String b) {
    System.out.println("执行业务方法doSome()");
    return a + b;
    }
    @Override
    public void doOther() {
    System.out.println("执行业务方法doOther()");
    }
    }
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import Service.service;
    import Service.serviceImple;
    public class ProxyEntrust implements InvocationHandler {
    private service target;
    public ProxyEntrust(service target) {
    super();
    this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Object result = method.invoke(target, args);
    return result;
    }
    }
    public class Client {
    public static void main(String[] args) {
    service target = new serviceImple();
    ProxyEntrust ih = new ProxyEntrust(target);
    service serviceProxy = (service) Proxy.newProxyInstance(
    target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
    String someResult = serviceProxy.doSome(5, "月份");
    System.out.println("someResult = " + someResult);
    }
    }

    以上代码展示了如何通过Java反射机制实现动态代理模式。 通过分析,可以看出代理类的核心逻辑在于方法调用的委托与转发。

    这一设计方式在以下场景下表现尤为突出:

    • 对业务逻辑高度抽象化的需求。
    • 对目标对象的实例化控制需求。
    • 需要实现远程调用或跨层业务流程的需求。

    通过合理设计InvocationHandler,可以更灵活地扩展系统功能。

    上一篇:CglibProxy!
    下一篇:Java的静态代理staticProxy

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年05月10日 15时03分28秒