反射的源码体系如下:
从查看源码所接触的类来说,这个内容不算多。
先来看一下其官方所给出的该包下的类:
另外,其逻辑相对而言也不是太难。 从查看的时间线进行解读吧。 既然是反射,那么首当其冲的便是Reflection了
这是判断该反射对象的修饰属性。
判断包是否一致,用于类加载器相关的操作。
判断是否为子类。
注册需要过滤的属性 和方法。
本地注册需要过滤的属性或者方法。
过滤需要的过滤的属性或者方法。
调用敏感,应该是用作安全相关的。
在该类被加载时执行的静态块,可见的是其将Class.class,System.class作了一些处理。至此便是所有关于Reflection截图结果。 通过观看它的类关系图,可以知道它并没有作为某一个抽象的子类或者实现,因此一次它所有的关于反射的操作同时通过依赖实现。 其依赖的主要的一些类有:Modify.class,Method.class,Field.class,Class.class。 接着看下Modify.class
官方权威说明的大体意思就是提供一种机制,根据jvm版本,将java字节码中关于特定修饰的属性给反解出来。。。
静态快所做的一些准备的必要操作。
应该是判断该地址编号下的类或者对象所具有的 一些相关的修饰,其结果是以字符串的形式追加上的。
对于特定的几种jvm版本反解的十六进制地址码所对应的辅助码吧。
由于这是与内存相关的,所以就给全贴出来了。
一些java语言的修饰符,大部分都用过,所以没标。 可以看到几乎所有的都有一个STRICT修饰符,也是自己没接触过的。 但是好像基础入门课的时候讲过,因为接触的较少自然忘得没底了。 自此看完所有的Modify.class的构成。 可以看到其主要是作为了一个辅助的作用。为其他的一些操作提供支持。 如方法 和 属性相关的操作。用于标志其权限。
然后看看Method.class和Field.class: 回顾类依赖和结构关系,可以知道它们都作为了 AccessibleObject抽象的实现,可以共同看一下AccessibleObject.class,其实现了接口AnnotatedElement接口:
这便是该几口提供的抽象,需要注意的是,属性和方法都遵循该抽象规范,并且该抽象为顶层抽象。 然后回溯看一看AccessibleObjec.class:
需要注意的是,虽然它作为了多个关键类的实现,但是其本身被没有被设置为抽象标签。 可以猜测的是其对于子类并没有向下提供抽象,并且是将高一层的抽象都实现了的。其子类的提供给的抽象在逻辑上一个补充,并提供的抽象。。
比较重要的 一个 超类接口的 实现。
由于当时写了注释,便一路向下:
这个方法依然是作为抽象接口的实现的一个补充。
后面的很多内容反射工厂有关。 至此该类已看完。 其关键的抽象方法都已贴出,并且其作为Method与Field的超类,本身也代表了该二者的一些属性与标准。
然后就可以看看Field了:
这里读出的信息有:get 和 set 方法是 pojo的题中之意。
这是其构造,在明白不过。需要注意的是,它作为一个普通类的子类,因此它具备它父类所具有的一些属性和行为。 看完Feild,然后了解一下 Method,看起类结构依赖图: 其在 AccessibleObject类的基础上进行了一层抽象,即Executable,为Method提供整体框架。 同时实现了Member接口:
发现该接口原来是作为了逻辑而存在,整个一空壳。。 接下来看Executable,其名称容易让人误解为一个抽象接口,但实际为一个抽象类。
其方法一览图如上,清晰命了。
其构造,跟Field的构造有异曲同工之妙。
可以知道反射可以对类中的行为进行执行,意思为执行的处理,可以说是比较关键的,而其实际执行的方法为:MethodAccess的Invoke方法。 追进去看,经过一段比较曲折的调用之后,其实际到了 sun包下的一些类中的方法。 关于Method的源码就解读到这。 因为其抽象 Executable所做的功能已经比较健全,因此当时看的时候并没有提供关于Method.class的相关源码 。最后了解一下上面提到的一个反射工厂:ReflectionFactory
就是这里了,做了与sun包的嫁衣。 其中 NativeMethodAccessorImpl 位于sun包下,其实际处理了Invoke ()方法 。 。
对于方法,构造方法,属性类实例的方法。 意思为 关于 这些包装类的实例方法 。 并不是指类的实例化的意思。