Bootstrap

Mockito原理剖析—无默认构造函数Mock原理

依赖:objenesisbytebuddy

过程:

对于Hotspot默认使用的是SunReflectionFactoryInstantiator,该方式会动态生成一个工厂类,通过该工厂类可以实现类似于默认构造函数的功能:

1、生成一个实现MagicAccessorImpl类的ConstructorAccessor

2、构造一个Constructor对象,设置ConstructorAccessor,当调用Constuctor#newInstance方法,创建对象的行为会委托至ConstructorAccessor#newInstance方法

创建目标类型的流程如下:

1、通过new指令创建目标类型的对象

2、调用Object.<init>初始化方法

该方法的原理是利用了JVM会对MagicAccessorImpl类进行检测,实现了MagicAccessorImpl的子类可以拥有下面特权:

1、绕过类加载时验证阶段:因为初始化方法都是使用Object的初始化方法,但是在验证阶段会校验初始化方法是否存在于直接父类,对于存在继承的类,而且父类不存在默认构造函数的情况,无法通过验证

2、绕过链接时的privateprotectedpackage受限访问检查

;