zoukankan      html  css  js  c++  java
  • 反射源码解析(一)

        反射的源码体系如下:

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

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

        

    另外,其逻辑相对而言也不是太难。  从查看的时间线进行解读吧。  既然是反射,那么首当其冲的便是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 ()方法 。 。

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



    原文链接

  • 相关阅读:
    DSA——基数排序
    cannot instantiate the type
    DSA——从尾到头打印链表笔记
    DSA——AVL平衡二叉树
    Leetcode——438. Find All Anagrams in a String【java】【没搞清楚呢】
    Leetcode——415. Add Strings【java】
    Leetcode——387. First Unique Character in a String【java】
    Leetcode——344. Reverse String
    Leetcode——205-Isomorphic Strings(同构字符串)【待反思周末】
    DSA——Shell排序算法
  • 原文地址:https://www.cnblogs.com/swanyf/p/10944955.html
Copyright © 2011-2022 走看看