静态代理与动态代理_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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 密钥库文件不存在: debug.keystore

    密钥库文件不存在: debug.keystore

    2021年9月30日
    57
  • 3D打印上位机软件

    3D打印上位机软件本文将主要介绍在3D打印中常见的3D打印上位机软件,这类3D软件将为用户提供较大的帮助,通过对这类软件的分类,用户可以选择使用最适合自己的软件。没有恐惧,我们已经回答了所有这些问题,以及熟练程度的细节和可以下载的细节。最重要的是,他们大多数是完全免费和开源的。我们错过了您最喜爱的3D打印软件吗?让我们在评论中知道,我们会在将来的更新中添加它们。1、curaCura可以被称…

    2022年5月31日
    64
  • Python元组_python基础知识

    Python元组_python基础知识元组元组的特点:是一种不可变序列,一旦创建就不能修改拆包将元组的元素取出赋值给不同变量>>>a=('hello','world',1

    2022年7月30日
    5
  • 《FFmpeg从入门到精通》读书笔记(三)

    《FFmpeg从入门到精通》读书笔记(三)写在前面2019.06.20第四章知识点(未进行排版,暂未加入硬编解码部分)FFmpeg转码FFmpeg软编码H.264与H.265FFmpeg本身不支持H.264的编码器,是由FFmpeg的第三方模块对其进行支持,当前常用的编码器为x264,所支持的像素格式主要包括以下几种(使用ffmpeg-hencoder=libx264进行查询)Encoderlibx264[l…

    2022年6月26日
    34
  • 搭建环境是什么意思_如何搭建安卓开发环境

    搭建环境是什么意思_如何搭建安卓开发环境WebIDE下载网址:https://tools.hana.ondemand.com/#sapui5下载好之后打开进入WEBIDE\eclipse\config_master\service.destinations\destinations,在destinations文件下面拷入SAPGUI的客户端配置(txt文档),URL填入GUI上配置的服务器地址就行,端口就配8080(有冲突的话在后台关掉),格式如下之后返回\WEBIDE\eclipse打开orion运行运…

    2022年10月10日
    2
  • erp学习交流社区

    erp学习交流社区[size=x-large]Hi,我是李彬,在ERP100俱乐部上建立了个人主页,邀请你也加入并成为我的好友。请加入到我的好友中,你就可以通过我的个人主页了解我的近况,分享我的照片,随时与我保持联系。邀请附言:请你点击以下链接,接受好友邀请:http://hi.erp100.com/invite.php?u=185659&c=9340c471d7847b99…

    2022年10月21日
    3

发表回复

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

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