浅析Jdk动态代理

  众所周知,Spring现已是Java企业级开发的重要角色。绝大多数的Java企业级应用都使用了Spring,而Spring源码设计中动态代理又是常常被使用到。今天我们就来简单讨论一下动态代理中的JDK动态代理(还有一种是CGLIB动态代理,这个以后再说)。

 

不管是JDK还是CGLIB得动态代理都有这样的一些特点:

  1.都有执行中和被代理对象

  2.对于被代理对象而言,有些事情我必需要去做,但是我又没有时间或不想去做,这时我会去找执行者帮我完成这些事情。

  3.执行者需要被代理人的个人资料

举个生活中的例子:

  我现在需要去租房子(这是一件必需要完成的事情),但是工作时间很紧,没有时间也没有房源的。这时候我就会去找租房子中介,告诉他们我要找的房子的一些要求和我个人的资料。由租房中介帮我去找满足我要求的房子。

  下面我们就来使用JDK动态代理完成这样的一个生活案例:

  首先创建一个Person的接口,里面有找房子的方法,代表需要找房子的人

    

package com.zxy.jdk;

/**
 * 需要租房子的人
 */
public interface Person {
    void findHouse();
}

 

 

创建一个Me的类(我现在就是要找房子的那个人)

package com.zxy.jdk;

/**
 * 我现在就是那个需要租房子的人
 */
public class Me implements Person {
    private String name;
    //我对房子的要求
    private String requirement;
    @Override
    public void findHouse() {
        System.out.println("130平方");
        System.out.println("临近地铁");
        System.out.println("环境优美");
    }
}

 

 

在创建一个Broker(中介)

package com.zxy.jdk;

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

/**
 * 租房中介
 */
public class Broker  implements InvocationHandler {
    private Object target;
    //获取被代理人的个人资料
    public Object getInstance(Object target){
        this.target = target;
        Class clazz = target.getClass();
        //把我的资料给到了中介
        return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }
    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println("开始在房源里面寻找....");
        System.out.println("突然发现找到了!");
        Object result = method.invoke(target, objects);
        System.out.println("我完成了和房东的签约");
        return result;
    }
}

 

 测试一下:

package com.zxy.jdk;

public class Test {
    public static void main(String[] args) {
        //中介对象
        Broker broker = new Broker();
        //把我的资料给到了中介,仿佛就像是我亲自在找房子一样
        Person me = (Person) broker.getInstance(new Me());
        me.findHouse();
    }
}

到此我们的一个简单的jdk动态代理,就实现了。动态代理的用处十分的广泛,Spring中的aop,使用的就是动态代理技术,而aop常用在事务管理,日志管理等多种场合。他们的基础都是动态代理技术。

如有不正确之处,希望不吝赐教。

 

posted @ 2018-12-02 11:38  你微笑时丶很美  阅读(151)  评论(0)    收藏  举报