JAVA代理模式之二动态代理JDK详解

上一篇说道代理模式的实现方式有2种,那么这次就看看动态代理怎么实现?
动态代理就是在程序运行中来生成代理类并完成代理对象的实例化。
动态代理实现的方式:
1、jdk实现
2、cglib实现
其中jdk的实现是java自身的实现,但是要求目标类(委托类)必须实现接口,因为jdk生成的代理类已经继承了java的代理类Proxy了,所以只能借助接口让代理类和委托类有关系。
抽象行为:就是接口

public interface IBlind {

    void blind();

}

来看看委托类

public class Miss implements IBlind{

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void blind() {
        // TODO Auto-generated method stub
        System.out.println(name+",相亲了");
    }

}

jdk代理的使用步骤:
1、创建类实现InvocationHandler接口
2、声明委托类对象并完成实例化
3、创建方法生成代理类对象
jdk的代理类的实现:

public class ProxyFactory implements InvocationHandler{

    private Object target;//目标类
    public ProxyFactory(Object obj){
        target=obj;
    }
    /**
     * 就是我们需要对方法的增强的实现
     * 参数说明:
     * 1、代理类的对象
     * 2、当前要执行的方法
     * 3、方法的实际参数
     * 返回值
     * 就是要执行的方法的返回值
     * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        long ms=System.currentTimeMillis();//记录开始时间
        System.out.println(method.getName()+"--开始:"+ms);
        Object res= method.invoke(target, args);//执行真正需要执行的方法
        return res;
    }
    //生成代理类对象
    public Object createProxy() {
        //1、创建类加载器
        ClassLoader loader=Thread.currentThread().getContextClassLoader();
        //2、获取目标类实现的所有的接口
        Class<?>[] interfaces=target.getClass().getInterfaces();
        //3、生成代理类并创建代理的对象
        /**
         * 参数说明:
         * 1、类的加载器,加载动态生成的类信息
         * 2、代理类需要实现的接口
         * 3、代理类中的方法的回调接口*/
        return Proxy.newProxyInstance(loader, interfaces, this);

    }

}

注意几个地方:
1、在invoke的方法内部在调用 method.invoke(target, args);第一个参数也就是方法所在类的对象,不能使用proxy,否则会陷入死递归。外界触发这个方法的时候就是通过代理对象调用该方法,你内部还是调用代理对象的该方法不就是没有出口的递归吗?
2、在外部接受代理对象时,不能使用委托类进行接受。
因为委托类和代理类之间没有直接联系,只是大家实现了相同的接口而已,无法进行对象造型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值