zoukankan      html  css  js  c++  java
  • java中的静态和动态代理Proxy

      理解java代理,应该是从最简单的静态代理开始。代理是对对象方法的一种增强,比如增加日志,静态代理的特点在于代理类只能代理一个一个类,并且要事先要编写好。

      动态代理是java语言的一个神奇的地方,不是很好理解,下面来看看关键的地方。

      InvocationHandler 是一个接口,官方文档解释说,每个代理的实例都有一个与之关联的 InvocationHandler 实现类,如果代理的方法被调用,那么代理便会通知和转发给内部的 InvocationHandler 实现类,由它决定处理。

    public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable;
    }

    InvocationHandler 内部只是一个 invoke() 方法,正是这个方法决定了怎么样处理代理传递过来的方法调用。

    proxy 代理对象

    method 代理对象调用的方法
    args 调用的方法中的参数

    method.invoke(ldh, args); //这个方法是核心,很重要,调用了被代理对象的方

    可以说,这两个invoke方法就是动态代理的核心,动态代理还多了一个对象proxy。

      代理技术是一种设计模式,其中动态代理也是Aop的基础,其中用到了两个重要的接口和类InvocationHandler,Proxy。

     动态代理又分为jdk和cglib,这两种差别,一些博客已经说得很清楚了。

      编写代码过程中发现了一个非常隐秘的错误:obj=this.obj;所以百度了很多东西,因为他们根本不会犯这种低级的错误,所以我浪费了很多时间,但是也对Proxy.newInstance()的使用印象深刻。在实在找不到错误的时候,我选择了copy一份,这是万不得已的方法,对于小的demo有用,但是如果在大型软件中就不行了。如果按照java的语法规则写,原则是不会出错的,但是我犯了很多错误,浪费了时间,所以做事要严谨。

    附上两篇文章:https://blog.csdn.net/pangqiandou/article/details/52964066,

    https://blog.csdn.net/briblue/article/details/73928350

    https://blog.csdn.net/fanrenxiang/article/details/81939357

  • 相关阅读:
    前端页面的防抖与节流
    vue3.0 响应式原理
    cssBEM命名规范及常用CSS class 命名
    vue2.x 响应式原理
    npm 相关命令
    Node之 fs
    Node 之 Buffer
    Node之path
    Node之process
    Node.js 如何处理 ES6 模块
  • 原文地址:https://www.cnblogs.com/Robin008/p/10241898.html
Copyright © 2011-2022 走看看