JDK 动态代理

news2024/12/25 9:00:47

动态代理机制 

Java 里面,动态代理是通过 Proxy.newProxyInstance()方法来实现的,它需要传入被动态代理的接口类
// 生成代理文件写入磁盘
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        ITradinPostService runService = (ITradinPostService) Proxy.newProxyInstance(ITradinPostService.class.getClassLoader(), new Class[]{ITradinPostService.class}, (proxy, method, args1) -> {
            System.out.println("动态代理");
            return "hello";
        });
        System.out.println(runService.run());

JDK 动态代理的底层实现 

之所以要传入接口,不能传入类,还是取决于 JDK 动态代理的底层实现 JDK 动态代理会在程序运行期间动态生成一个代理类$Proxy0。
这个动态生成的代理类 会继承 java.lang.reflect.Proxy 类,同时还会实现被代理类的接口 IHelloService。 在 Java 中,是不支持多重继承的。而每个动态代理类都会继承 Proxy 类(这也是 JDK 动态代理的实现规范),所以就导致 JDK 里面的动态代理只能代理接口,而不能代理 实现
public final class $Proxy0 extends Proxy implements ITradinPostService {
    // 省略
    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }

    public final String run() throws  {
        try {
            return (String)super.h.invoke(this, m3, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }
    // 省略

}
Proxy 这个类只是保存了动态代理的处理器InvocationHandler,如果不抽出来,直接设置到$Proxy0 动态代理类里面,也是可以的。
  • 动态代理本身的使用场景或者需求,只是对原始实现的一个拦截,然后去做一些功能的增强或者扩展。而实际的开发模式也都是基于面向接口来开发,所以基于接口来实现动态代理,从需求和场景都是吻合的。当然确实可能存在有些类没有实现接口的,那这个时候,JDK 动态代理确实无法满足。
  • 在 Java 里面,类的继承关系的设计,更多的是考虑到共性能力的抽象,从而提高 代码的重用性和扩展性,而动态代理也是在做这样一个事情,它封装了动态代理类生成的抽象逻辑、判断一个类是否是动态代理类、InvocationHandler 的持有等等,那么把这些抽象的公共逻辑放在 Proxy 这个父类里面,很显然是一个比较正常的设计思路。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DP专题5 不同路径||

题目: 思路: 这道题,思路跟 不同路径| 思路一样,只是不同的是,有障碍物这一块,我们的二维dp数组初始化的时候,要注意,机器人只能向右和向下,所以初始化第一行和第一列的…

黑龙江省DCMM认证、CSMM认证、CMMM认证、知识产权等政策奖励

2023年8月28日 为深入落实党的二十大精神,认真落实省第十三次党代会关于创新龙江建设的部署要求,全面贯彻新发展理念,融入和服务构建新发展格局,实施创新驱动发展战略,着力建设创新龙江,不断塑造振兴发展新…

基于Yolov8网络进行目标检测(二)-安装和自定义数据集

关于Yolov8的安装在前一个环节忽略了,其实非常简单,只需要以下两个步骤: 1、安装pytorch pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2、安装ultralytics pip install ultralytics 为什…

功率放大器驱动压电陶瓷有哪些应用

功率放大器在压电陶瓷材料领域的应用。首先,介绍了压电陶瓷的基本概念和特性。然后,阐述了功率放大器的基本原理和分类。接着,分析了功率放大器在压电陶瓷材料领域的应用,包括声波发生器、超声波清洗器、超声波切割器、医疗超声波…

企业架构LNMP学习笔记44

小工具: memcached_tool.php软件,可以查看memcached运行状态、key(item)的数量、内存使用量等。 1)上传memcached_tool.php到web服务器上: 上传到虚拟机主机可以访问的目录即可。需要php的运行环境&…

C语言——指针进阶(三)

目录 一.前言摘要 二.排序函数qsort的模拟实现 三.指针和数组笔试题解析 一.前言摘要 讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现(可以排序任意类型变量) 二.排序函数qsort的模拟实现 目标:…

如何选择适合企业的SQL开发工具

在当今数字化时代,数据是企业的核心资产之一。随着数据规模和数据类型的不断增长,数据库管理变得愈发复杂和关键。许多企业用户在数据库管理方面都面临着一系列难题: 核心数据库被随意变更:核心库的波动通常会对企业核心业务产生重…

还没用熟 TypeScript 社区已经开始抛弃了

根据 rich-harris-talks-sveltekit-and-whats-next-for-svelte 这篇文章的报道, Svelte 计划要把代码从 TS 换到 JS 了。 The team is switching the underlying code from TypeScript to JavaScript. That and the update will then allow the team to incorporate…

Enhancer-轻量化的字节码增强组件包

一、问题描述 当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的To C的互联网企业来说,整个系统都是构建于微服务的架构…

金和OA GetSqlData.aspx 远程命令执行漏洞

一、漏洞简介 金和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,涉及的企业管理业务包括协同办公管理、人力资源管理、项目管理、客户关系管理、企业目标管理、费用管理等多个业务范围,从功能型的协同办公平台上升到管理型协同管理平台,并不断的更新完善…

一款自定义软件开发平台源码 支持企业应用的专业低代码开发

低代码PaaS平台源码 采用对象方式实现字段、API的字段类型,引入RPA实现表自动化建模;再使用选择方式对地段功能进行选择定义甚至可以插入代码进行自定义。 数字化转型的迫切需求 随着数字科技的发展,各行各业对于新技术解决方案的需求也在逐…

小节8:Python之文件操作

1、文件在哪里? 如果用代码对文件进行操作,需要先找到那个文件 MacOS/Linux:斜杠/ 表示根目录,一切的文件、目录都存放在根目录下面。 Windows系统:就不一样了,它每一个磁盘分区都有自己的根目录&#x…

算法:二分法---寻找H指数

1、题目: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他&#xff0…

港联证券:基本面分析的基本知识?

作为一种股票投资剖析办法,根本面剖析是用来研究一家公司在剖析期内的运营状况的一种办法,它重视公司的财政数据、盈余才能、市场占有率以及宏观经济要素等方面,为投资者供给了一个深化了解公司价值的方法。下面,本文将从多个视点…

C语言 —— 初步入门知识(第一个C语言程序、数据类型、变量常量、字符与注释)

本篇文章介绍C语言的基础知识,使读者对C语言能够有一个大概的认识. 不会细写每一个知识点, 但是能够入门C语言, 进行初步的C语言代码阅读. 首先, 什么是语言? 对于人和人之间进行交流的语言, 我们知道, 可以通过汉语, 英语, 日语等语言进行交流. 那么对于人和计算…

spring_注解笔记

spring使用注解开发 文章目录 1.前提1 Bean2 属性注入3 衍生的注解4.自动装配5 作用域 1.前提 步骤1&#xff1a; 要使用注解开发&#xff0c;就必须要保证AOP包的导入 步骤2&#xff1a; xml文件添加context约束 步骤3&#xff1a; 配置注解的支持 <context:annotation-…

【python零基础入门学习】python基础篇(基础结束篇)之数据结构类型-列表,元组,字典,集合(五)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

电商运营管理——商品活动

商品活动很大程度上决定了电商平台的用户活跃度&#xff0c;本篇文章将详细介绍商品活动的几大类目&#xff0c;并举例每一类的不同活动内容。希望本篇文章能对运营岗位的你有所帮助。 电商平台最重要的功能是运营管理&#xff0c;而运营管理中最重要的功能就是各种商品活动&am…

阿里巴巴国际数字商业24届校招大量hc,等你来拿~

阿里巴巴国际数字商业招人啦!!! 今年阿里lazada买家前端团队有大量hc, 同学们快冲啊!!! 除了前端岗,还有算法, 客户端等 图中的二维码为我的个人内推码, 直接扫码进去填写简历提交即可, 后续可以帮忙查看内推进度, 有什么疑问我会在线回复 职位要求 【必备项】 1、熟练使用各种…

程序员自由创业周记#11:商标

商标重要吗 为什么我那么重视App名字里要有一个自己的商标&#xff0c;主要防止的是被竞争对手抄袭&#xff0c;甚至连名字也起同样的&#xff0c;如果没有商标&#xff0c;很难维权&#xff0c;只能放任自由。在上上家公司&#xff0c;我们的产品起了一个与别人重复的名字&am…