java源码解析之反射代理(一)

    处于种种原因,本应该早就写了的这篇文章,却一直u通道现在。 废话不多说,开始正文。

    反射的源码体系如下(由于水平有限,精力有限,因此不十分准确):

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

    从查看源码所接触的类来说,这个内容不算多。   

    先来看一下其官方所给出的该包下的类:

    《java源码解析之反射代理(一)》

另外,其逻辑相对而言也不是太难。  从查看的时间线进行解读吧。  既然是反射,那么首当其冲的便是Reflection了

《java源码解析之反射代理(一)》

    这是判断该反射对象的修饰属性。 

《java源码解析之反射代理(一)》

    判断包是否一致,用于类加载器相关的操作。

《java源码解析之反射代理(一)》

    判断是否为子类。

《java源码解析之反射代理(一)》

    注册需要过滤的属性 和方法。

《java源码解析之反射代理(一)》

    本地注册需要过滤的属性或者方法。

《java源码解析之反射代理(一)》

    过滤需要的过滤的属性或者方法。

《java源码解析之反射代理(一)》

    调用敏感,应该是用作安全相关的。

《java源码解析之反射代理(一)》

在该类被加载时执行的静态块,可见的是其将Class.class,System.class作了一些处理。至此便是所有关于Reflection截图结果。 通过观看它的类关系图,可以知道它并没有作为某一个抽象的子类或者实现,因此一次它所有的关于反射的操作同时通过依赖实现。  其依赖的主要的一些类有:Modify.class,Method.class,Field.class,Class.class。    接着看下Modify.class

《java源码解析之反射代理(一)》

    官方权威说明的大体意思就是提供一种机制,根据jvm版本,将java字节码中关于特定修饰的属性给反解出来。。。

《java源码解析之反射代理(一)》

    静态快所做的一些准备的必要操作。

《java源码解析之反射代理(一)》

    应该是判断该地址编号下的类或者对象所具有的 一些相关的修饰,其结果是以字符串的形式追加上的。

《java源码解析之反射代理(一)》

    对于特定的几种jvm版本反解的十六进制地址码所对应的辅助码吧。

《java源码解析之反射代理(一)》

    由于这是与内存相关的,所以就给全贴出来了。 

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

    一些java语言的修饰符,大部分都用过,所以没标。  可以看到几乎所有的都有一个STRICT修饰符,也是自己没接触过的。 但是好像基础入门课的时候讲过,因为接触的较少自然忘得没底了。   自此看完所有的Modify.class的构成。 可以看到其主要是作为了一个辅助的作用。为其他的一些操作提供支持。  如方法  和  属性相关的操作。用于标志其权限。

   然后看看Method.class和Field.class:  回顾类依赖和结构关系,可以知道它们都作为了  AccessibleObject抽象的实现,可以共同看一下AccessibleObject.class,其实现了接口AnnotatedElement接口:

    《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

    这便是该几口提供的抽象,需要注意的是,属性和方法都遵循该抽象规范,并且该抽象为顶层抽象。 然后回溯看一看AccessibleObjec.class:

《java源码解析之反射代理(一)》

    需要注意的是,虽然它作为了多个关键类的实现,但是其本身被没有被设置为抽象标签。  可以猜测的是其对于子类并没有向下提供抽象,并且是将高一层的抽象都实现了的。其子类的提供给的抽象在逻辑上一个补充,并提供的抽象。。 

《java源码解析之反射代理(一)》

    比较重要的 一个 超类接口的 实现。

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

    由于当时写了注释,便一路向下:

《java源码解析之反射代理(一)》

《java源码解析之反射代理(一)》

    这个方法依然是作为抽象接口的实现的一个补充。 

《java源码解析之反射代理(一)》

    后面的很多内容反射工厂有关。  至此该类已看完。  其关键的抽象方法都已贴出,并且其作为Method与Field的超类,本身也代表了该二者的一些属性与标准。 

    然后就可以看看Field了:

《java源码解析之反射代理(一)》

    这里读出的信息有:get 和 set 方法是 pojo的题中之意。 

《java源码解析之反射代理(一)》

    这是其构造,在明白不过。需要注意的是,它作为一个普通类的子类,因此它具备它父类所具有的一些属性和行为。 看完Feild,然后了解一下 Method,看起类结构依赖图:  其在  AccessibleObject类的基础上进行了一层抽象,即Executable,为Method提供整体框架。 同时实现了Member接口:

《java源码解析之反射代理(一)》

    发现该接口原来是作为了逻辑而存在,整个一空壳。。 接下来看Executable,其名称容易让人误解为一个抽象接口,但实际为一个抽象类。 

《java源码解析之反射代理(一)》

    其方法一览图如上,清晰命了。  

《java源码解析之反射代理(一)》

    其构造,跟Field的构造有异曲同工之妙。 

《java源码解析之反射代理(一)》

    可以知道反射可以对类中的行为进行执行,意思为执行的处理,可以说是比较关键的,而其实际执行的方法为:MethodAccess的Invoke方法。 追进去看,经过一段比较曲折的调用之后,其实际到了  sun包下的一些类中的方法。 关于Method的源码就解读到这。  因为其抽象  Executable所做的功能已经比较健全,因此当时看的时候并没有提供关于Method.class的相关源码 。最后了解一下上面提到的一个反射工厂:ReflectionFactory

《java源码解析之反射代理(一)》

    就是这里了,做了与sun包的嫁衣。    其中  NativeMethodAccessorImpl  位于sun包下,其实际处理了Invoke ()方法 。 。

《java源码解析之反射代理(一)》

    对于方法,构造方法,属性类实例的方法。  意思为  关于  这些包装类的实例方法 。  并不是指类的实例化的意思。 

    这里便是关于反射所要记录的所有问题。  明天将要记录的是代理相关的知识。   晚安,好梦!

 

 

 

    原文作者:java源码分析
    原文地址: https://blog.csdn.net/qq_36285943/article/details/80146452
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞