zoukankan      html  css  js  c++  java
  • 代理-jdk动态代理

    1、基于接口的实现,要jdk动态代理的类必须要实现一个接口;

    2、中介类:实现了InvocationHandler,并重写这个接口的 方法(public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{method.invoke(this.target, args);}),类似下面

    public class JDKProxy implements InvocationHandler {    
        
        private Object targetObject;//需要代理的目标对象    
        
        public Object newProxy(Object targetObject) {//将目标对象传入进行代理    
            this.targetObject = targetObject;     
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),    
                    targetObject.getClass().getInterfaces(), this);//返回代理对象    
        }    
        
        public Object invoke(Object proxy, Method method, Object[] args)//invoke方法    
                throws Throwable {    
            Object ret = null;      // 设置方法的返回值    
            ret  = method.invoke(targetObject, args);       //invoke调用需要代理的方法
            return ret;    
        }   
    }

    3、Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this)

      3.1:根据clazz.getInterfaces():循环遍历接口,动态生成接口实现类的代理类(比如:proxy0.java)

        生成的类会有InvocationHandler h的属性,构造方法会有参数进行这个h属性赋值,其余方法中会this.h.invoke(this,m,args)进行调用

      3.2:编译源代码,并且生成.class文件

      3.3:通过clazz.getClassLoader()的findClass加载生成的class到jvm并返回代理对象

      3.4:根据2.3的代理类通过构造传参this(JDKProxy ),实例化代理对象proxy0

      

  • 相关阅读:
    window.onload 、body.onload 以及 jQuery 等dom加载完成后执行脚本的区别
    HTML5事件-pageshow 和 pagehide
    动态加载script 和 link
    递归 recursive
    HTML5事件-自定义右键菜单
    left与margin-left区别
    偏移量、客户区、滚动大小
    屏幕适配
    KVC和KVO
    HUD总结
  • 原文地址:https://www.cnblogs.com/aishangyizhihu/p/11383526.html
Copyright © 2011-2022 走看看