关于jdk11 反射的一些

反射是运行时加载,意味着(程序计数器)寄存器在加载前并不知道要加载的内容,但代码都是要经过 编译的,即代码的具体操作都是已知的。

以下为示范案例:   

第一步进入 getDeclaredConstructor():

最终指向 Permission 父类,此时我们拿到了反射工厂这个类的对象。

第2步:进入getConstructor0(parameterTypes, Member.DECLARED)

进入privateGetDeclaredConstructors

然后就发现到这里就不能继续了。  这里才是真正拿到构造方法的地方

我们可以在后面的参数中看到,这里已经拿到构造函数的各种数据了

进入fact.getExecutableSharedParameterTypes(constructor))   ==== 获取可执行的共享参数类型     

进入getExecutableSharedParameterTypes   获取可执行文件的参数类型的共享数组。

结果只是调用了一个get方法。那么我们的parameterTypes是来自哪里的?查看一下整个类,是没有set方法的,那么这些参数只能是来自构造函数。

来到构造函数处,可以发现这个确实存在。  我们回顾privateGetDeclaredConstructors,在那里我们拿到了构造函数的各种数据

第三步进入copyConstructor

此时可以发现copy方法就是新建一个new

到这里,getDeclaredConstructor()就分析完毕。其核心的方法获取工厂对象(getReflectionFactory)以及获取底层数据的getDeclaredConstructors0


而newInstance()的实现也是依赖native方法。在此之前都是做一些判断,封装。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容