java静态代理及动态代理(学习示例)

1.接口

        public interface Channel {
            void send();
        }

2.实现类(可以为各种不同实现)

        public class ChannelImpl implements Channel {
            @Override
            public void send() {
                System.out.println("send Message");
            }
        }

3.静态代理:代理类

        public class ChannelProxy implements Channel{
            //代理对象
            Channel channel;
            //传入代理对象
            public ChannelProxy(Channel channel){
                this.channel = channel;
            }
            @Override
            public void send() {
                System.out.println("start send message");
                channel.send();
                System.out.println("end send message");
            }
        }

3.动态代理:代理类

        /**创建代理实现InvocationHandler*/
        public class MyHandler implements InvocationHandler {
            /**
             * 目标对象
             */
            Object target;

            public MyHandler(Object target){
                this.target = target;
            }
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("start send message");
                System.out.println("调用目标对象:"+target.getClass()+",目标方法:"+method.getName());
                Object result = method.invoke(target);
                System.out.println("end send message");
                return result;
            }
        }

4.调用

        public class ProxyTest {
            public static void main(String [] args){
                System.out.println("=================静态代理===================");
                Channel channel = new ChannelImpl();
                ChannelProxy channelProxy = new ChannelProxy(channel);
                channelProxy.send();

                System.out.println("=================动态代理===================");
                MyHandler myHandler = new MyHandler(channel);
                Channel target = (Channel)(Proxy.newProxyInstance(channel.getClass().getClassLoader(),channel.getClass().getInterfaces(), myHandler));
                target.send();
            }
        }

5.结果

        =================静态代理===================
        start send message
        send Message
        end send message
        =================动态代理===================
        start send message
        调用目标对象:class proxy.ChannelImpl,目标方法:send
        send Message
        end send message

比较:

静态代理:
代理类不用关心具体哪个实现类及如何实现send方法,调用时只需要代理类即可,解耦.但是代理类及实现类需全部实现接口,若添加接口,则代理类与实现类均需添加,代码冗余,且改代理类只能代理该一个接口,若需要代理其他接口,则需要创建新的代理类
动态代理:
在静态代理基础上,去除了静态代理的冗余,无需实现指定的接口,任何接口均可代理,若接口Channel还有其他方法如create()方法,则MyHandler的invoke一样会进行处理,所以当接口中方法比较多时,我们又需要对该接口中的方法进行统一处理,则使用动态处理更为方便,复用性更强

原文地址:https://www.cnblogs.com/lantuanqing/p/11302811.html