原文地址:点我
关键点:
静态代理:
实现被代理类的接口
构造注入
动态代理
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