jdk动态代理

本文通过一个娱乐场景解释了Java中的动态代理概念,明星作为接口的实现,经纪人作为代理对象,在不修改原有功能的基础上,增加了额外的操作如表演前的准备。代理对象利用`Proxy.newProxyInstance`创建,并通过`InvocationHandler`处理方法调用,实现了在调用明星(接口)的方法时,添加了额外的行为。
摘要由CSDN通过智能技术生成

在不改变原功能的情况下,在代理对象中进行增强。

假设有一个场景,明星是一个群体,所有的明星都会唱、篮球、rap。

那么你想当一个明星,你就要会唱歌、打篮球、rap。

这时,观众想看某个明星表演。但是观众无法直接找到明星让他表演,需要通过明星的经纪人,跟经纪人谈好后才会让明星进行表演。

经纪人也需要做出一些准备,才可以让明星进行表演。

在这个场景中,明星群体就是一个接口,定义了唱、篮球、rap三个抽象方法。而明星就是明星群体接口的子类,需要实现所有方法。经纪人就是明星群体的代理对象。

接下来看代码:

明星群体(接口):

public interface Star {

    public String sing(String name);

    public void basketball();

    public String rap();
}

明星个人(实现子类):

public class StarPerson implements Star{

    private String name;

    public StarPerson(String name) {
        this.name = name;
    }


    @Override
    public String sing(String name) {
        System.out.println(this.name + "正在唱:" + name);
        return "鸡鸡鸡鸡鸡鸡鸡你太美~";
    }

    @Override
    public void basketball() {
        System.out.println(this.name + "打篮球很帅!");
    }

    @Override
    public String rap() {
        System.out.println(this.name + "的rap好听吗!!");
        return "只因你太美~";
    }
}

经纪人(代理对象):

public static Star createProxy(StarPerson starPerson){

        /**
         * 创建代理对象
         * ClassLoader loader,      类加载器
         * Class<?>[] interfaces,   接口的字节码对象,指定的代理长什么样,有哪些方法
         * InvocationHandler h      指定生成的代理对象要做什么事情
         */
        Star starProxy = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
                    /**
                     * 回调方法,代理对象执行方法会调用invoke方法
                     * @param proxy     当前的代理对象
                     * @param method    当前代理对象执行的方法
                     * @param args      执行方法的参数
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        String behavior = method.getName();
                        if (behavior.equals("sing")){
                            System.out.println("听我唱歌,备好纸巾。");
                        } else if (behavior.equals("basketball")){
                            System.out.println("看我打球,尖叫起来。");
                        } else if (behavior.equals("rap")){
                            System.out.println("要听rap,先买票。");
                        }
                        return method.invoke(starPerson,args);
                    }
                }
        );
        return starProxy;
    }

观众(调用方法):

public static void main(String[] args) {
        Star starProxy = ProxyUtil.createProxy(new StarPerson("你鸡哥"));
        String sing = starProxy.sing("征服");
        System.out.println(sing);

        starProxy.basketball();

        String rap = starProxy.rap();
        System.out.println(rap);
    }

执行结果:

听我唱歌,备好纸巾。
你鸡哥正在唱:征服
鸡鸡鸡鸡鸡鸡鸡你太美~
看我打球,尖叫起来。
你鸡哥打篮球很帅!
要听rap,先买票。
你鸡哥的rap好听吗!!
只因你太美~

执行流程:

        以上内容纯属娱乐,如有不严谨的地方,欢迎各位大佬留言私信进行指正,还请各位大佬不吝赐教。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值