反射源码解析(二)
依赖的结构图:
类不是很多,按查看的时间线来进行记述。
官方说明,配合有道蹩脚的翻译。。
解释很多,再读的时候发现已经有些蒙蔽。大致是描述 代理 的结构构成。
执行的相关参数。
InvocationHandler作为一个抽象,充当该类中的关键实现。 类似于Thread 与 Runnable的关系。
构造的相关说明。 可见其留给子类的只有一个构造,即 包含 InvocationHandler的构造。
比较重要的一个方法。 对于代理的接口有数量的限制。
代理类的缓存。。 通过查看源码,可以看到其中有两个十分关键的内部类,KeyFactory和 ProxyClassFactory。 再结合类结构依赖图,可以看到它们与ref包下的一些类有较密切的联系,因此不妨进去看看:
图中的反射应为引用,笔误笔误。
以上是Reference的一些较重要的说明,然后看一下它主要的一个依赖:ReferenceQueue:
看它的名字,本以为会继承util包下的一些机构方法。 看后知道原来它是自己使用的一个引用队列,通过自己的属性。 挺有意思的。看完引用相关的,回溯到 proxy中的两个主要的内部类
其一,KeyFactory
其二,ProxyClassFactory
后面调试的时候可以发现,这个厉害了。 因为它是到目前为止所知的能够生成类的相关的一套方法。 我们一起顶多也就实例化类之类的,拷贝对象等等。 所有的这种从无到有的操作都是基于对象,这个可是基于类。 算是颠覆了一下自己的认知,以后有机会了研究。
看完了大致的一些方法,回顾一下这个类,可以知道它有一个关键成员 InvocationHandler t。 因此不得不去看一下:
其提供了invoke方法的抽象。 此外便没有什么特别的。 另外,前面的KeyFactory不同程度地继承了引用体系,同时实现了BiFunction。 猜测可能是二进制方法的意思。其构成:
可以发现它是有三个泛型类,这还是比较少见的。 这里它即声明了参数类型,对象,以及返回值。 这跟invoke方法有一些相似呢。
以上便是关于代理的相关内容。 接下来记录的是调试的过程。