代理模式之动态代理的实现——jdk

动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

动态代理最大的特点就是没有代理类
动态代理有两种实现方式,CGLib与jdk,这里用的是jdk实现动态代理
就静态代理举个栗子

故事背景

有两个人,有很多money的张三和24K纯屌丝李四,他们做着做同样的事情——惹上了官司和吃饭,张三就雇用专业的律师打官司,饭自己吃;李四雇不起律师,只好自己上,饭当然也是要自己吃……用动态代理实现如下

接口

package com.hk.service;
/**
 * 定义一个接口(一类人要做的事情)
 * @author 浪丶荡
 *
 */
public interface ISomeService {
    //打官司
    public String Litigate();
    //吃饭
    public String eat();
}

目标类

package com.hk.service;
/**
 *  目标类
 * @author 浪丶荡
 *
 */
public class ISomeServiceImp implements ISomeService {

    @Override
    public String Litigate() {
        return "自己打官司,输了";
    }

    @Override
    public String eat() {
        return "自己吃饭";
    }

}

测试方法

package com.hk.test;

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

import com.hk.service.ISomeService;
import com.hk.service.ISomeServiceImp;
public class MyTest {
    public static void main(String[] args) {
        //有money人张三
        final ISomeService zhangsan = new ISomeServiceImp();
        //屌丝李四
        ISomeService lisi = new ISomeServiceImp();

        //张三请的律师打官司,饭自己吃
        ISomeService sp = (ISomeService) Proxy.newProxyInstance(
                            zhangsan.getClass().getClassLoader(),   //目标类的类加载器
                            zhangsan.getClass().getInterfaces(),    //目标类所实现的所有接口
                            new InvocationHandler() {               //匿名内部类
                                /**
                                 * proxy 代理对象
                                 * method 目标方法(代理的业务)
                                 * args 目标方法的参数列表
                                 */
                                @Override
                                public Object invoke(Object proxy, Method method, Object[] args)
                                        throws Throwable {

                                    if(method.toString().contains("eat")){//吃饭就不用律师代劳了,自己来
                                        return (String)method.invoke(zhangsan, args);//反射,调用张三的方法;
                                    }
                                    return "律师打官司,赢了";

                                }
                            });
        System.out.println("zhangsan"+sp.Litigate()+"-----"+sp.eat());
        //苦逼的李四自己打官司,自己吃饭
        System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat());
    }
}

结果

zhangsan律师打官司,赢了-----自己吃饭
lisi自己打官司,输了-----自己吃饭
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值