设计模式--动态代理

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

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

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

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

 

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

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

 

步入正题……

老样子,先看一下类结构

设计模式--动态代理_第1张图片

其中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();

    }
}

 

你可能感兴趣的:(java,设计模式)