设计模式--动态代理

步入正题之前,先闲聊几句。

思想:动态代理是利用反射的机制在运行时动态的创建类

  • 反射:动态创建对象
  • 动态代理:动态创建类

了解动态代理,反射有助于了解框架的底层实现,才能更好的运用框架。

 

看这一篇前,可以先参考一下上一篇文章

https://blog.csdn.net/meetbetterhc/article/details/99597369

 

步入正题……

老样子,先看一下类结构

其中ServiceTarget与上一篇中的一样,这里我就不啰嗦了,上边有链接

其实,Service2Target2与上边几乎一样

Service2类

package com.design.dynamicproxy;

public interface Service2 {
    public void m4();
    public void m5();
    public void m6();
}

Target2类

package com.design.dynamicproxy;

public class Target2 implements Service2 {
    @Override
    public void m4() {
        System.out.println("target2  m4");
    }

    @Override
    public void m5() {
        System.out.println("target2  m5");
    }

    @Override
    public void m6() {
        System.out.println("target2  m6");
    }
}

DynamicProxy类

package com.design.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 */
public class DynamicProxy {
    //    利用反射动态生成代理类
//    为target对象生成一个用于计数的代理对象
    public static Object createProxy(Object target){
//        三个参数分别是:类加载器,类实现的接口,匿名内部类(重写invoke方法)
        Object o=Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        long t1=System.nanoTime();
//                        调用目标对象的相应方法
                        Object o=method.invoke(target,args);//反射 :方法.调用(对象,参数)
                        long t2=System.nanoTime();
                        System.out.println(t2-t1);
                        return o;
                    }
                });
        return o;
    }

}

Test类

package com.design.dynamicproxy;

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        Service t1=new Target();
        Service p1=(Service) DynamicProxy.createProxy(t1);
//        不管p1调用的是哪个方法,实际上都调用的是invoke方法,invoke方法里写代理做什么的逻辑
        p1.m1();
        p1.m2();
        p1.m3();
        Service2 t2=new Target2();
        Service2 p2= (Service2) DynamicProxy.createProxy(t2);
        p2.m4();
        p2.m5();
        p2.m6();

    }
}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值