天天看点

Java增强:静态代理与动态代理

  1. 什么是代理模式 ?
  2. 有几种代理模式,代码实现
  3. 代理模式 和  装饰模式的区别

part1: 代理模式的概念

Java增强:静态代理与动态代理

代理模式: 不改变源码的情况下,实现对目标对象的功能扩展,对代理的对象施加控制,并不提供对象本身的增强功能(装饰模式为所装饰的对象增强功能,组织结构类似于静态代理, 但‘同途 梳归’, 两个目的不同)

Java增强:静态代理与动态代理

part2: 代码实现(动态代理)

A, 定义接口

interface Person {
    void say(String name);

    void sleep();
}

interface Work {
    void work();
}
           

B, 定义接口实现类

class P1 implements Person, Work{

    @Override
    public void say(String name) {
        System.out.println("hello "+ name);
    }

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

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

C, 1-----代理实现类:自定义方法增强类InvocationHandler

public InvocationHandler createHandler() {
        //对象: 接口实现类
        final P1 p1 = new P1();

        // 处理器
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object res = null;

                //方法增强: 前后控制
                if (method.getName().equals("sleep")) {
                    System.out.println();
                    System.out.println("----------handler  before--- 增强sleep ..");
                    res = method.invoke(p1, args);
                    System.out.println("----------handler  after---增强sleep ..\n");

                } else if (method.getName().equals("say")) {
                    System.out.println("=========");

                    Person p = (Person) proxy;
                    p.sleep();

                    System.out.println("*********handler  before---增强say ..");
                    res = method.invoke(p1, args);
                    System.out.println("*********handler  after---增强say ..");

                    System.out.println("=========");

                } else {//不增强方法
                    res = method.invoke(p1, args);
                }
                return res;
            }
        };

        //返回: 接口实现类
        return handler;
    }
           

    2------调用Proxy的静态方法: 创建代理对象

@Test
    public void newInstance() {
        // 代理工具类Proxy :创建对象 ( 接口,  处理器)
        Object obj = Proxy.newProxyInstance(

                ProTest.class.getClassLoader(),
                new Class[]{Person.class, Work.class},
                createHandler()
        );
        Person person = (Person) obj;
        person.say("lilsi");

        // 代理类: 创建对象
        Work worker = (Work) obj;
        worker.work();
    }
           

测试结果:动态控制原生对象方法的调用(对原对象--增强say方法,   原生调work方法 )

Java增强:静态代理与动态代理

继续阅读