依赖:objenesis
、bytebuddy
过程:
对于Hotspot默认使用的是SunReflectionFactoryInstantiator
,该方式会动态生成一个工厂类,通过该工厂类可以实现类似于默认构造函数的功能:
1、生成一个实现MagicAccessorImpl
类的ConstructorAccessor
2、构造一个Constructor
对象,设置ConstructorAccessor
,当调用Constuctor#newInstance
方法,创建对象的行为会委托至ConstructorAccessor#newInstance
方法
创建目标类型的流程如下:
1、通过new
指令创建目标类型的对象
2、调用Object.<init>
初始化方法
该方法的原理是利用了JVM会对MagicAccessorImpl
类进行检测,实现了MagicAccessorImpl
的子类可以拥有下面特权:
1、绕过类加载时验证阶段:因为初始化方法都是使用Object
的初始化方法,但是在验证阶段会校验初始化方法是否存在于直接父类,对于存在继承的类,而且父类不存在默认构造函数的情况,无法通过验证
2、绕过链接时的private
、protected
、package
受限访问检查