设计模式之代理模式笔记(三)

    原文地址:点我

  关键点:

静态代理:

  实现被代理类的接口

  构造注入 

动态代理

reflect  高级码农必须深入理解的

扩展知识点 class.forname 使用这个不会产生新的实例, 只是为了加载 链接 初始化(静态) 

    我们大家一直用的spring 其中强大的功能aop就是基于这

注意点:

  动态代理有个强制性要求 被代理的类必须时间了某一个接口, 或者本身就是接口(这个接口的实现类非必要)

 三步骤 

  构造注入

  实现invoke

  获取代理实例 参数 类加载器 class对象的数组 当前对象

接口如果没有实现直接使用method.invoke()会报以下错误,

  IllegalArgumentException: object is not an instance of declaring class

就是意译

  文中指出可以突破这种限制

  大意就是用注入的对象获取该class对象所表示的类或者接口指定已声明的方面, 

  其中需要注意的是setAccessible() 设置值 也就是被private修饰的成员变量或者方法是否可以被调用

值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
 
 源码解析 代理对象的获取 Proxy.newProxyInstance(类加载器,对象集合,代理对象)

对象的获取:
  getProxyClass(加载器, 接口集合)

    版本1.7  

        ①65535长度限制  

        ②expungeStaleEntries() 删除陈旧的实类

        ③CacheKey.valueOf(key, refquce){知识点传送门}

   简单总结下 Java对象的强、软、弱和虚引用

     强引用: 强可及对象, A a =new A();

     软引用: A a =new A(); B b = new B(a); A a1 = b.getA();

     弱引用: 配合WeakReference 使用 一旦 软引用级别及以上的应用被赋值为null, 手动调用gc, 能够立即回收

     虚引用: PhantomReference, 形态虚设 , 其中的get方法是无法获取到地址的

    补充: q: 匿名类属于哪种引用? a:测试下来应该是属于弱引用, 是真实存在的, 类似的操作 , list.add(new A()); list.remove[index], System.gc(); 用完就回收了

       ④ConcurrentMap 线程安全的集合 使用的是子类hashmap   putIfAbsent 方法 类似 if(!map.containsKey(key)){return map.put(key,value)}else{ return map.get(key)}

   ⑤

    5.1supplier 生产者                              

    5.2.1如果不存在 创建工厂                         5.0.1如果生产存在, 但没有 value

    5.2.2对生存者赋值             5.0.2创建工厂

                         5.0.3 替换replace value 成功后对生产者赋值  否则 get

生成的代理类 extend Proxy implements 代理的对象  

     其中就是调用invoke

原文地址:https://www.cnblogs.com/denghailei/p/6347669.html