动态代理Java实现

思考:在IBuyWatermelon添加一个方法selectWatermelon()

静态代理中需要在RealSubject中实现该方法,而且Proxy也要实现该方法调用RealSubject中的实现,如果再增加10个方法还是得这样操作,导致大量的代码重复。

现在来看动态代理(顾名思义,是在运行时才形成的代理对象,不像静态代理在编译时就载入代理对象)。

生成动态代理的方法有很多: JDK中自带的动态代理java.lang.reflect.*, CGlib等

下面的例子是JDK中自带的动态代理java.lang.reflect.*

 

IBuyWatermelon():接口

package com.maggie.dynamicproxy;public interface IBuyWatermelon {//代理事件public abstract String buyWatermelon();public abstract void selectWatermelon();
}

 

BuyWatermelonImpl:实现类

package com.maggie.dynamicproxy;//可理解成被代理者
public class BuyWatermelonImpl implements IBuyWatermelon {private Supermarket supermaket;public BuyWatermelonImpl(Supermarket supermaket) {super();this.supermaket = supermaket;}@Overridepublic String buyWatermelon() {System.out.println("在"+supermaket.getName()+" 买西瓜");return "watermelon";}@Overridepublic void selectWatermelon() {System.out.println("选择无籽西瓜");}}

 

ProxyFactory:代理对象类(核心代码)

package com.maggie.dynamicproxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyFactory {//维护一个目标对象private Object target;public ProxyFactory(Object target){this.target=target;}//给目标对象生成代理对象public Object getProxyInstance(){//动态代理的核心,涉及到反射return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//执行目标对象方法Object returnValue = method.invoke(target, args);return returnValue;}});}

}

客户端调用

package com.maggie.dynamicproxy;public class Main {public static void main(String[] args) {Supermarket zhaoLiu = new Supermarket();zhaoLiu.setName("赵六超市");IBuyWatermelon target  = new BuyWatermelonImpl(zhaoLiu);//被代理的对象//创建代理对象IBuyWatermelon hourskeeper = (IBuyWatermelon) new ProxyFactory(target).getProxyInstance();hourskeeper.buyWatermelon();hourskeeper.selectWatermelon();}
}

输出

在赵六超市 买西瓜
选择无籽西瓜

 

现在就算IBuyWatermelon的方法再怎么增加,也只需要在BuyWatermelonImpl实现,就可以在客户端调用,不会出现大量的重复代码。

从静态代理到动态代理都围绕着卖瓜事件,为了前后方便比较,但是动态代理并没完,里面的源码机制才是核心关键

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)这个方法是整个动态代理实现的关键

 

转载于:https://www.cnblogs.com/maggiejyt/p/7569123.html

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

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

相关文章

mysql 非等值条件 索引_慢SQL简述与定位

慢SQL日志简述通过命令和查看日志文件的方式直接查看mysql服务器的慢sql参数配置参数作用slow_query_log是否启用slow_query_log_file日志文件long_query_time慢sql阈值log_slow_adimin_statements是否记录数据库管理相关的sqllong_queries_not_using_indexes是否记录未使用索引…

大数据是怎么知道你去过新发地的?

来源&#xff1a;科学加&#xff08;北京科技报记者&#xff1a;赵天宇&#xff09;“经过全市大数据分析&#xff0c;您可能在5月30日(含)以后去过新发地批发市场……”随着新发地市场新冠源头被锁定&#xff0c;近日来&#xff0c;大数据筛查&#xff0c;成为不少北京市民在朋…

[模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表

一年前听说的这东西。。。现在终于会了。。。 1 #include<cstdio>2 #include<iostream>3 #include<cstring>4 #include<cmath>5 #include<ctime>6 #include<cstdlib>7 8 #include<string>9 #include<stack>10 #include<que…

mysql更新数据能回滚吗_MySQL数据回滚-误更新和删除时快速恢复

这世界上有后悔药– www.houhuiyao.cc 后悔药数据恢复 站长语前面的内容也提到过update或delete误更新删除了数据后如何恢复。实际生产环境中常常因各种不同场景导致一些办法有效一些办法无效&#xff0c;当然&#xff0c;最有效的办法依然是备份&#xff01;虽然啰嗦&#xff…

口罩巨头挑战“量子霸权”,3个月造出的『最强量子计算机』靠谱不?

摘要霍尼韦尔(Honeywell)最近可是非常忙活。作为全球数一数二的口罩厂商&#xff0c;疫情期间霍尼韦尔一直在努力生产口罩&#xff0c;大家对它的印象也多停留在口罩生产者的层面。但是事实上&#xff0c;人家是正经的多元化高科技制造企业&#xff0c;航空产品、汽车产品、涡轮…

三极管稳压管组成的线性电源关键理解

1. A点电压为20V.B点电压是稳压管电压5.6V.则A到B的电流是固定的。 2. 加电后在调整三极管&#xff0c;负载&#xff0c; 稳压管的电流回路如图。&#xff08;注意电流方向&#xff0c;a->b电流方向和大小都是基本不变的。&#xff09; 转载于:https://www.cnblogs.com/ture…

oci连接mysql_使用 OCILIB 连接并操作 Oracle 数据库

OCILIB是一个跨平台的Oracle驱动程序&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一个丰富&#xff0c;功能齐全&#xff0c;并易于使用的APIOCILIB是一个跨平台的Oracle驱动程序&#xff0c;&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一…

万字长文:2020智源大会总结-多角度看AI的未来

来源&#xff1a;混沌巡洋舰导读&#xff1a;智源大会2020 聚焦AI的未来&#xff0c;大家都知道&#xff0c; 2010是深度学习的时代&#xff0c; 我们经历了AI从巅峰进入到瓶颈的过程。那么什么是2020这个十年AI的中心&#xff1f;近一段大家逐步从各个不同的角度切入到这个主题…

python OCR 图形识别

1、pip install pyocr 2、pip install PIL 3、安装tesseract-ocr http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe exe文件&#xff0c;下载后直接安装&#xff0c;建议默认安装过程中的选项&#xff0c;安装目录默认C:\Program F…

python生成文件夹并向文件夹写文件_python - 文件练习生成100个MAC地址写入文件

需求&#xff1a;生成100个MAC地址并写入文件中&#xff0c;MAC地址前6位(16进制)为01-AF-3B解题思路&#xff1a;要求生成这样格式的mac地址&#xff1a;01-AF-3B-xx-xx-xx首先生成-xx格式&#xff0c;16进制组成的数,注意MAC英文字母为大写。拼接成为&#xff1a;01-AF-3B-xx…

智能发展与双重建构

来源&#xff1a; 人机与认知实验室本文摘自1983.5《国内哲学动态》皮亚杰有关同化和顺应及其平衡的图式学说是对智慧机制的一种结构主义的共时性分析,但是他更重视对智慧机制进行建构主义的历时性研究。主体关于客体的知识以及主体自身的认识图式都不仅仅是一种状态体系 , 而首…

2017.09.21学习总结

两天的时间主要学习了html的基本结构&#xff0c;标签&#xff0c;列表以及表格。 表格方面<td><tr>总是弄混&#xff1b; 合并用起来有些眼花&#xff0c;不过仔细的研究一下还是没什么问题。 加油&#xff01;努力&#xff01;目标&#xff1a;资深码农~~转载于:…

springboot2整合mysql5_SpringBoot2整合SSM框架详解

SpringBoot2整合SSM框架详解发布时间&#xff1a;2019-01-15 21:33,浏览次数&#xff1a;1218, 标签&#xff1a;SpringBootSSM<>开发环境* 开发工具&#xff1a;Eclipse STS插件* JDK版本&#xff1a;9.0.4* MySQL版本&#xff1a;8.0.12* Spring Boot版本&#xff1a;…

前途无量的MEMS传感器

来源&#xff1a;转载自「民生证券」&#xff0c;谢谢微机电系统&#xff08;Microelectromechanical Systems&#xff0c;简称 MEMS&#xff09;是将微电子技术与精密机械技术结合发展出来的工程技术&#xff0c;尺寸在 1 微米到 100 微米量级&#xff0c;涵盖机械&#xff08…

怎么查看kudu的版本_apache版本kudu kudu-impala安装方法

kudu安装方法简介第一步&#xff1a;下载rpm包http://archive.cloudera.com/kudu/redhat/6/x86_64/kudu/5.12.2/RPMS/x86_64/kudu-1.4.0cdh5.12.20-1.cdh5.12.2.p0.8.el6.x86_64.rpmkudu-client-devel-1.4.0cdh5.12.20-1.cdh5.12.2.p0.8.el6.x86_64.rpmkudu-client0-1.4.0cdh5.…

错误:子进程 已安装 pre-removal 脚本 返回了错误号 1

解决办法sudo rm /var/lib/dpkg/info/<package name>.*转载于:https://www.cnblogs.com/rabitvision/p/7588113.html

【技术趋势】德勤发布2020技术趋势报告,五个新趋势可引发颠覆性变革

来源&#xff1a;产业智能官“2020 年的趋势将颠覆整个行业&#xff0c;并在未来十年重新定义业务&#xff0c;即使数字创新已成为各种规模企业的常规行为。”德勤管理咨询新兴技术研究总监兼政府及公共服务首席技术官 Scott Buchholz 在一份报告中如是说。近日&#xff0c;《德…

Java IO流

IO流是用来处理设备之间的数据传输的&#xff0c;Java对数据的操作都是使用流的方式处理的&#xff0c;而且Java将处理流的操作封装成IO流对象了。 一、IO流的分类 流按照操作的数据分为&#xff1a;字节流、字符流 流按照流的方向分为&#xff1a;输入流、输出流 二、字节流&a…

mysql 模糊查询用法_mysql进阶(六)模糊查询的四种用法介绍

mysql中模糊查询的四种用法介绍这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下。下面介绍mysql中模糊查询的四种用法&#xff1a;1 %&#xff1a;表示任意0个或多个字符。可匹配任意类型和长度的字符&#xff0c;有些情况下若是中文&#xff0c;请使用两个…

Nature:FB和推特的数据是如何革新社会科学,改变世界的?

大数据文摘出品来源&#xff1a;nature编译&#xff1a;张睿毅2007年&#xff0c;一群有野心的科学家召集了一次会议&#xff0c;讨论新兴的社会科学数据处理的艺术。他们想运用自己的技能来改变世界。在演讲中&#xff0c;马萨诸塞州剑桥市哈佛大学的政治学家加里金&#xff0…