当前位置:首页 > CN2资讯 > 正文内容

十七、动态代理

12小时前CN2资讯

一、动态代理概述:

代理:

用一个代理将对象包装起来(代理类和被代理类实现了一套接口),然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理;代理对象决定是否以及何时将方法调用转到原始对象上。

 

动态代理:

需求: 最好可以通过一个代理类完成全部的代理功能;由此产生了动态代理;

 

二、应用举例

静态代理应用

1 //***************************静态代理 代理类 被代理类 接口*************************
2 //接口
3 interface ClothFactory {
4 void produceColth();
5 }
6
7 //代理类
8 class ProxyClothFactory implements ClothFactory {
9
10 private ClothFactory factory;// 用被代理类的对象进行实例化
11
12 public ProxyClothFactory(ClothFactory factory) {
13 super();
14 this.factory = factory;
15 }
16
17 @Override
18 public void produceColth() {
19 // TODO Auto-generated method stub
20 System.out.println("produceColth.....start");
21 factory.produceColth();
22 System.out.println("produceColth.....end");
23 }
24
25 }
26
27 //被代理类
28 class NikeClassFactory implements ClothFactory {
29
30 @Override
31 public void produceColth() {
32 System.out.println("Nike 制造衣服");
33 }
34 }
35
36 public class Day29Proxy04 {
37
38 /**
39 * 静态代理 举例
40 *
41 * 特点:代理类和被代理类在编译期间就确定下来了;
42 *
43 * @Description
44 * @author lixiuming
45 * @date 2021年9月25日下午3:56:09
46 *
47 */
48 @Test
49 public void test1() {
50 NikeClassFactory nike = new NikeClassFactory();
51 ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike);
52 proxyClothFactory.produceColth();
53 }
54
55

 

动态代理应用:

1 //*************************动态代理 接口 被代理类 动态代理工厂********************
2 interface Human {
3 String getBelief();
4
5 void eat(String food);
6 }
7
8 //被代理类
9 class SuperMan implements Human {
10
11 @Override
12 public String getBelief() {
13 return "I believe I can fly";
14 }
15
16 @Override
17 public void eat(String food) {
18 System.out.println("我喜欢吃" + food);
19 }
20
21 }
22
23 /**
24 * 动态代理工厂类
25 *
26 * 问题一、 如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象? 问题二、当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法?
27 *
28 * @Description
29 * @author lixiuming
30 * @date 2021年9月25日下午4:01:03
31 *
32 */
33 class ProxyFactory {
34
35 // 调用此方法,返回一个代理类的对象,解决了问题一
36 public static Object getProxyInstance(Object obj) {// obj为被代理类的对象
37 MyInvocationHandler handler = new MyInvocationHandler();
38 handler.bind(obj);
39 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
40 }
41
42 }
43
44 class MyInvocationHandler implements InvocationHandler {
45
46 private Object obj;// 需要被代理类的对象进行赋值
47
48 public void bind(Object obj) {
49 this.obj = obj;
50 }
51
52 // 当我们通过代理类的对象,调用方法a时,就会自动的调用如下方法:invoke()
53 // 将被代理类要执行的方法a的功能就声明在invoke()中
54 @Override
55 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
56 // method 代理调用的对象调用的方法,此方法也作为被代理类对象调用的方法
57 // obj 被代理类的对象
58 return method.invoke(obj, args);
59 }
60
61 }
62
63 public class Day29Proxy04 {
64
65 /**
66 * 动态代理举例
67 *
68 * @Description
69 * @author lixiuming
70 * @date 2021年9月25日下午4:01:03
71 *
72 */
73 @Test
74 public void test2() {
75 SuperMan superMan = new SuperMan();
76 // 代理类的对象
77 Human object = (Human) ProxyFactory.getProxyInstance(superMan);
78
79 // 当通过代理类对象调用方法时,会自动调用被代理类同名的方法;
80 object.eat("四川麻辣烫");
81
82 NikeClassFactory nike = new NikeClassFactory();
83
84 ClothFactory object1 = (ClothFactory) ProxyFactory.getProxyInstance(nike);
85 object1.produceColth();
86 }
87
88

 

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。



    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24547.html

    分享给朋友:

    “十七、动态代理” 的相关文章

    如何利用VPS挖矿赚钱:低成本高收益的加密货币挖矿指南

    VPS挖矿的基本概念 VPS挖矿是一种利用虚拟专用服务器(VPS)的计算资源进行加密货币挖矿的方式。VPS通常用于托管网站或运行应用程序,但它的计算能力也可以被用来执行挖矿算法。挖矿本质上是通过解决复杂的数学问题来验证交易并创建新的加密货币区块,作为回报,矿工会获得一定数量的加密货币。VPS挖矿特别...

    如何有效解决VPS硬盘占用过高问题:优化与清理指南

    1.1 系统日志和缓存文件积累 系统日志和缓存文件是VPS硬盘占用过高的常见原因之一。每次系统运行或应用程序执行时,都会生成日志文件来记录操作和错误信息。这些日志文件随着时间的推移会逐渐积累,占用大量磁盘空间。缓存文件也是如此,它们用于加速系统或应用程序的运行,但如果不定期清理,也会占用大量空间。我...

    解决Hostodo打不开的有效方法和详细步骤

    在使用Hostodo的过程中,偶尔会遇到打不开的情况。这种问题可能会让人感到挫败,但其实有几个常见原因可以帮助我们找到解决办法。首先,网络连接问题是最普遍的原因之一。无论是局域网的配置,还是Wi-Fi的信号不稳定,都会导致连接失败。我记得第一次遇到这种情况时,发现原来是我的路由器出了问题,重新启动后...

    搭建VPN梯子的最佳VPS推荐,轻松畅游网络

    在探索Internet的过程中,VPN梯子的搭建显得尤为重要。VPN梯子,简单来说,是通过虚拟专用网络(VPN)创建的一个安全通道,它能够帮助用户绕过地理限制,访问被封锁的网站和服务。随着互联网信息安全和隐私保护需求的增加,搭建VPN梯子成为越来越多用户的选择。 想象一下,当我们在国外旅行时,无法访...

    AkkoCloud评测:为中国用户打造的高性价比VPS与独立服务器解决方案

    AkkoCloud成立于2019年,作为一家具备国人运营背景的主机商,逐渐在海内外VPS和独立服务器市场中占据了一席之地。我的亲身体验让我感受到,AkkoCloud的设计初衷就是为中国大陆的用户提供一个稳健可靠的服务器解决方案。对于很多用户来说,它的出现无疑填补了国内市场的一部分空白。 回想起我探索...

    甲骨文云账号如何注销:详尽步骤与注意事项

    甲骨文云账号注销流程 注销甲骨文云账号的流程其实并不复杂,但有几个关键步骤需要认真对待。整个过程主要分为几个部分,包括登录甲骨文云控制台、发起注销请求、查看注销请求状态,以及最后的等待和确认删除。 1.1 甲骨文云控制台的登录 进入甲骨文云控制台的第一步,就是要登录到你的账号。打开浏览器,访问甲骨文...