Java 动态代理

1、程序为什么需要代理?代理有什么方法?

对象如果觉得身上干的事太多的话,可以通过代理来转移部分职责。

        如明星和经纪人,明星只想做唱歌跳舞和演戏,不想被其他事情干扰,如拉赞助等,因此就请经纪人代理干这些事        

对象有什么方法想被代理,代理就一定有对应的方法。

        如明星有唱歌跳舞的方法,经纪人也应该有唱歌跳舞的方法,但是经纪人不是真的会唱歌跳舞,当程序需要用到明显的唱歌方法,此时会去调用经纪人的唱歌方法,在这个方法里面,经纪人会去准备话筒和收钱等操作,之后会去调明星的唱歌方法,让明星来唱歌

2、中介如何知道要派有唱歌、跳舞方法的代理呢?

解决方法:接口

// 明星接口

public interface Star {

        String sing(String name);

        void dance();

}

// 具体明星

public class SupperStar implements Star {

        private String name;

        public SupperStar(String name) {

                this.name = name;

        }

        public String sing(String songName) {

               System.out.println(this.name + "正在唱:" + name )

                retuen "谢谢!"

        }

        public void dance() {

                System.out.println(this.name + "正在跳舞" )

        }

}

// 代理

import java.lang.reflect.Proxy;

public class ProxyUtil {

        public static Star creatProxy (SupperStar ss) {

                /**

                * newProxyInstance(ClassLoader loader,

                *                                Class<?>[] interfaces,

                *                                InvocationHandler h)

                * 参数1:指定类加载器;

                * 参数2:指定生成的代理长什么样子,也就是有哪些方法

                * 参数3:用来指定生成的代理对象要干什么事情

                */

                //Star starProxy = ProxyUtil.creatProxy(s);

                // starProxy.sing("好日子");starProxy.

                Star  starProxy = (Star) Proxy.newProxyInstance(ProxyUtil.class.gerClassLoader,

                                                new Class[] {Star.class}, new InvocationHandler() {

                                                        @Override // 回调方法

                                                        public Object invoke(Object proxt,Methpd method, Object[] args) throws Throwable} {

                                                               // 代理对象做的事情

                                                                if (method.getName().equals("sing")) {

                                                                        System.out.println("准备话筒,收钱20w");

                                                                } else if (method.getName().equals("dance")) {

                                                                        System.out.println("准备场地,收钱1000w");

                                                                }

                                                                return method.invoke(ss,args);

                } );

                return starProxy;

        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值