静态代理与动态代理_java静态代理动态代理

静态代理与动态代理_java静态代理动态代理讲解静态代理与动态代理的实现示例,静态代理与动态代理的区别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

静态代理

静态代理使用场景

在实际使用中,经常会遇到一些场景:想在多方法前或方法后加一个共同的方法,如在方法执行前后打印日志、在方法执行完成发送消息通知等。这个时候,我们可以在方法前后调用公用方法,也可以使用代理实现,当然,代理的作用不止如此,这里不做赘述,实现方法如下:

实现方法

先创建一个接口

public interface TestInterface {

    void showMessage();
}

创建一个具体的类,实现这个接口,再创建一个代理类,也实现这个接口

代理类加一个有参构造方法,创建代理类对象的时候传具体类对象即可

// 具体类
public class TestImpl implements TestInterface {

    @Override
    public void showMessage() {
        System.out.println("message");
    }
}

// 代理类
class TestProxy implements TestInterface {

    private TestInterface testInterface;

    public TestProxy(TestInterface testInterface) {
        this.testInterface = testInterface;
    }

    @Override
    public void showMessage() {
        printLogBefore();
        testInterface.showMessage();
        printLogAfter();
    }

    private void printLogBefore() {
        System.out.println("logger before");
    }

    private void printLogAfter() {
        System.out.println("logger after");
    }
}

调用代理类

public static void main(String[] args) throws Exception {
        TestProxy t = new TestProxy(new TestImpl());
        t.showMessage();
    }

执行结果

logger before
message
logger after

JDK动态代理

静态代理的具体类与代理类的对应关系是一对一,那么动态代理可以理解为多对多

动态代理是通过反射实现的

实现方法:

 先创建一个接口

public interface TestInterface {

    void showMessage();
}

创建一个具体的类,实现这个接口,再创建一个代理类,这里与静态代理不同,动态代理的代理类实现的是java.lang.reflect.InvocationHandler接口

被代理类

public class TestImpl implements TestInterface {

    @Override
    public void showMessage() {
        System.out.println("show message");
    }
}

代理类

public class TestProxy<T> implements InvocationHandler {

    private T obj;

    public T build(T obj) {
        this.obj = obj;
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        printLogBefore();
        method.invoke(obj, args);
        printLogAfter();
        return null;
    }

    private void printLogBefore() {
        System.out.println("print log before");
    }

    private void printLogAfter() {
        System.out.println("print log after");
    }
}

调用方法

public static void main(String[] args) {
        TestInterface t = new TestProxy<TestInterface>().build(new TestImpl());
        t.showMessage();
    }

返回结果

print log before
show message
print log after

 静态代理与动态代理的区别

  • 静态代理是在编译时已经创建好的,动态代理是在程序运行过程中通过反射创建的
  • 静态代理在运行前就知道是代理哪个类,而动态代理需要在运行的时候才能确定
  • 静态代理通常只代理一个类,而动态代理可以代理接口下所有类
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183834.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月31日 下午12:36
下一篇 2022年8月31日 下午12:46


相关推荐

  • 深度信念网络DBN的一个matlab实例「建议收藏」

    关于深度学习的一些个人浅见:   深度学习通常是训练深度(多层)神经网络,用于模式识别(如语音、图像识别);深度网络指是具有深层(多层)网络结构的神经网络。   深层网络由于神经元多,参数多,拟合表现能力强,有表现欲解决复杂问题的能力。   但是深度网络存在很多局部最优解,深度网络的训练容易停留在局部最优上,初始参数的选择对网络最终收敛在那个位置有很大的影响。

    2022年4月12日
    193
  • Kimi K2支持哪些编程语言和API接入方式?

    Kimi K2支持哪些编程语言和API接入方式?

    2026年3月16日
    2
  • pycharm安装2021_idea环境配置

    pycharm安装2021_idea环境配置环境配置这一篇是给新手朋友准备的,如果你本地已经安装配置,请自行跳过Python代码运行,需要解释器,Python解释器下载地址:https://www.python.org/鼠标悬停在Downloads上,然后选择对应的操作系统,点击版本号即可。我这里以Python3.9.2为例官网下载较慢,可以在公众号:Python极客专栏,后台回复【python392】获取安装包。下载完毕,双击打开(建议以管理员身份运行)。不建议按照默认的方式安装,参考下图点击之后出现如下界面Docu

    2022年8月29日
    7
  • Java集合ArrayList和LinkedList区别

    Java集合ArrayList和LinkedList区别Java 的集合类主要由两个接口派生而出 Collection 和 Map Collection 和 Map 是 Java 集合框架的根接口 Java 集合大致可以分为 Set List Queue 和 Map 四种体系 其中 Set 代表无序 不可重复的集合 List 代表有序 重复的集合 而 Map 则代表具有映射关系的集合 Queue 体系集合 代表一种队列集合实现 jdk1 4 以前没有 Queue 集合 一般用 Linked

    2026年3月18日
    2
  • 水流量霍尔传感器工作原理_51单片机温度传感器

    水流量霍尔传感器工作原理_51单片机温度传感器硬件准备(1)YF-B1流量传感器一个(2)51开发板一个基础知识(1)YF-B1流量传感器只有三根线。即数据线、VCC、GND。数据线输出为占空比为50%的方波。当水流通过水流转子组件时,磁性转子转动并且转速随着流量的变化而成线性变化。霍尔传感器(霍尔元件采样)输出相应的脉冲信号。其流量脉冲特性计算公式为:脉冲f(Hz)=8.1x流量Q(L/min)-3。(2)51单片机的中断…

    2026年4月18日
    5
  • 大数据与互联网的关系

    大数据与互联网的关系

    2021年9月4日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号