zoukankan      html  css  js  c++  java
  • 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一样会进行处理,所以当接口中方法比较多时,我们又需要对该接口中的方法进行统一处理,则使用动态处理更为方便,复用性更强

  • 相关阅读:
    spring的@Transactional注解详细用法
    C#中对string与string[]的初步操作
    响应式下的雪碧图解决方案 - 活用background-size / background-position
    background-position 详解
    sass学习笔记
    微信小程序实操-image height:auto问题,url地址报错,“不在以下合法域名列表中”问题等
    如何开发一个微信小程序
    括号生成 回溯算法 递归 深度优先遍历 剪枝
    前K个高频元素 数字型 Hash表解决
    寻找重复的数 hash表
  • 原文地址:https://www.cnblogs.com/lantuanqing/p/11302811.html
Copyright © 2011-2022 走看看