提供高级 API,用于在 super/this 调用之前在构造函数中插入代码
作者: kriegaex创建于 2020年6月5日更新于 2020年7月2日
标签enhancement
背景: JVM 允许在最终 super/this 调用之前插入任何 byte code(只要它不访问 this 或实例字段,用简化的术语来说),尽管在 Java 源代码中,这是不允许的,因为 super/this 调用必须是任何构造函数中的第一条指令。 byte code 验证器在加载类或通过工程重新转换类时也会检查这一点。因此,如果您想跳过构造函数执行,则必须插入类似于以下内容:if (myCondition) { doThings(); super(0, null, false); } 也就是说,您还必须在跳过原始 super/this 调用时调用 super/this,但可以使用其他参数,从而避免任何副作用,只使用默认值。如果针对整个构造函数链(包括扩展 Object 的超类)进行此操作,则有助于避免对象初始化,这在创建模拟对象时非常有用。即使对于引导类(包括已加载的最终类),此操作也能正常工作。我只是希望能够更轻松地使用 BB 来避免对另一个 byte code 工程框架的依赖(目前我还使用 Javassist)。
与此功能相关的其他功能:
- 用于确定任何给定类型(包括原始类型)的默认值(即
null、0、'\0'、false、(short) 0、0L、0.0f、0.0d)的便利方法 - 用于将所有参数设置为上述默认值的 super/this 调用的便利方法
- 返回给定类的 super 类的有序集合(列表、堆栈、数组)的便利方法
内容来源: raphw/byte-buddy