文档章节

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

code-ortaerc
 code-ortaerc
发布于 10/22 01:11
字数 718
阅读 8
收藏 0

动态代理的原理是什么?

所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调用者和实现者之间解耦,常见的代理模式包括:JDK Proxy、cglib。

JDK动态代理

下面可以看看JDK动态代理的一个简单的例子,下面只是加了一句print,在生产系统中,我们可以轻松扩展类似逻辑进行诊断、限流等。

  • 接口Hello
public interface Hello{
    void sayHello();
}
  • 接口的实现类HelloImpl
public class HelloImpl implements Hello {

    @Override
    public void sayHello() {
        System.out.println("Hello JDK Dynamic Proxy!!!");
    }
}
  • DynamicProxyMain类
public class DynamicProxyMain {

    public static void main(String[] args) {
        HelloImpl hello = new HelloImpl();
        JDKDynamicProxy handler = new JDKDynamicProxy(hello);

        //构造代码实例
        Hello proxyHello = new JDKDynamicProxy(new HelloImpl()).getProxy();
        //使用代理对象调用代理方法
        proxyHello.sayHello();
    }

    /**
     * 创建一个代理类JDKDynamicProxy实现java.lang.reflect.InvocationHandler接口,重写invoke方法
     */
    static class JDKDynamicProxy implements InvocationHandler{

        private Object target;
        public JDKDynamicProxy(Object target) {
            this.target = target;
        }

        /**
         * 获取被代理接口实例对象
         * @param <T>
         * @return
         */
        public <T> T getProxy() {
            return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("正在代理sayHello方法......");
            Object result = method.invoke(target, args);
            return result;
        }
    }
}

运行main函数,结果如下:

正在代理sayHello方法......
Hello JDK Dynamic Proxy!!!
  • 上面的JDK Proxy例子,非常简单地实现了动态代理的构建和代理操作。首先,我们自定义对应的 JDKDynamicProxy ;然后,以接口Hello为纽带,为被调用目标创建代理对象,进而应用程序就可以使用代理对象间接运行调用目标的逻辑,代理为应用插入额外逻辑(这里仅仅提供println方法)提供了入口。
  • 不过,JDK动态代理也有一定局限性,因为必须是以接口为中心,相当于添 加了一种对于被调用者没有太大意义的限制。我们实例化的是 Proxy 对象,而不是真正的 被调用类型,这在实践中还是可能带来各种不便和能力退化。
  • 如果被调用者每月实现接口,而我们有希望使用动态代理机制,那么就可以考虑使用其他的方式,比如:Spring AOP支持两种模式的动态代理,JDK Proxy和cglib,选择cglib可以克服对接口的依赖。

© 著作权归作者所有

code-ortaerc
粉丝 0
博文 18
码字总数 21637
作品 0
广州
私信 提问
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
285
0
好程序员Java学习路线之Spring框架之动态代理

好程序员Java学习路线之Spring框架之动态代理,前言:动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解...

好程序员IT
07/18
52
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
JDK动态代理-超详细源码分析

本文转载自JDK动态代理-超详细源码分析 一、为什么需要动态代理 1.1 从代理模式说起 代理模式是指给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我...

淡淡的倔强
2018/09/07
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
2018/04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

BigDecimal 去后面无用的0的方法

BigDecimal a=new BigDecimal("0.1000"); System.out.println(a.stripTrailingZeros().toPlainString());...

xiaodong16
17分钟前
5
0
JAVA--高级基础开发

[集合版双色球] 十二、双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择;请随机生成一注双色球号码。(要求同色号码...

李文杰-yaya
昨天
16
0
聊聊rocketmq broker的CONSUMER_SEND_MSG_BACK

序 本文主要研究一下rocketmq broker的CONSUMER_SEND_MSG_BACK CONSUMER_SEND_MSG_BACK rocketmq/common/src/main/java/org/apache/rocketmq/common/protocol/RequestCode.java public class......

go4it
昨天
3
0
API常见接口(下)

system类 StringBuilder和StringBuffer 包装类 1.System类 (java.lang包中) 提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。 常用方法: public static long currentTimeMi...

Firefly-
昨天
4
0
MySQL系列:一句SQL,MySQL是怎么工作的?

对于MySQL而言,其实分为客户端与服务端。 服务端,就是MySQL应用,当我们使用net start mysql命令启动的服务,其实就是启动了MySQL的服务端。 客户端,负责发送请求到服务端并从服务端获取数...

杨小格子
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部