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

第一步进入 getDeclaredConstructor():






最终指向 Permission 父类,此时我们拿到了反射工厂这个类的对象。
第2步:进入getConstructor0(parameterTypes, Member.DECLARED)

进入privateGetDeclaredConstructors

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

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

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


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


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

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

第三步进入copyConstructor


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

到这里,getDeclaredConstructor()就分析完毕。其核心的方法获取工厂对象(getReflectionFactory)以及获取底层数据的getDeclaredConstructors0
而newInstance()的实现也是依赖native方法。在此之前都是做一些判断,封装。

