zoukankan      html  css  js  c++  java
  • 代理模式一:动态代理

    定义

    为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。

    其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。

    静态代理

    创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。

    动态代理

    利用反射原理,Proxy动态生成被代理对象,实现InvocationHandler接口,利用其中的invoke方法执行目标类的方法。

    • 定义一个接口
    public interface ProxyTargetInterface {
    
        public Integer add(Integer a,Integer b);
    }
    
    • 定义一个类实现该接口
    public class ProxyTargetImpl implements ProxyTargetInterface{
    
    
        public Integer add(Integer a,Integer b){
            System.out.println("a+b的输出值为:"+(a+b));
            return a+b;
        }
    
    }
    
    • 定义一个代理类
    public class ProxyHandler {
    
        public Object proxy(Object object){
    
            Object proxyInstance = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {
    
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println("代理之前-----");
                    //进行执行代理方法
                    Object invoke = method.invoke(object, args);
                    System.out.println("代理之后-----");
                    return invoke;
                }
            });
    
            return proxyInstance;
        }
    }
    
    • 进行测试
    class handler{
    
        public static void main(String[] args) {
            ProxyTargetImpl target=new ProxyTargetImpl();
            ProxyHandler handler=new ProxyHandler();
            ProxyTargetInterface proxy =(ProxyTargetInterface) handler.proxy(target);
            Integer add = proxy.add(1, 2);
            System.out.println(add);
        }
    }
    

    思考

    1:动态代理为啥必须要实现接口
    2:为啥不能method.invoke(proxy, args)这样编码,那Object proxy有何作用。

    参考:https://www.jianshu.com/p/9bcac608c714
    https://www.zhihu.com/question/20794107

    XFS
  • 相关阅读:
    android获得屏幕高度和宽度
    Android中RelativeLayout各个属性的含义
    Android JNI知识简介
    Android结束进程方法
    android开发中的图片资源问题
    android framework下public.xml中添加资源问题
    I'm back
    test,exec,match,replace方法区别 正则
    fiddler抓包工具 https抓取 ios手机端抓取
    前端优化方案
  • 原文地址:https://www.cnblogs.com/xiaofengshan/p/14903575.html
Copyright © 2011-2022 走看看