ByteBuddy能否生成静态初始化块?解决LoadedTypeInitializer非持久化问题
ByteBuddy生成持久化静态初始化块方案
ByteBuddy完全可以生成持久化到字节码中的静态初始化块,和你示例里class Foo { static { /** Added code here **/ } }的形式完全一致,这和LoadedTypeInitializer的临时执行逻辑有本质区别:
LoadedTypeInitializer是类加载到JVM时由ByteBuddy的类加载器触发执行,不会写入生成的字节文件;- 静态初始化块则是直接编译进字节码,任何加载该类的场景下,类初始化阶段都会自动执行,完全持久化。
基础实现示例
通过ByteBuddy的initializer()方法即可快速添加静态初始化逻辑,示例代码如下:
import net.bytebuddy.ByteBuddy; import net.bytebuddy.implementation.MethodCall; import net.bytebuddy.matcher.ElementMatchers; public class StaticInitializerDemo { public static void main(String[] args) throws Exception { // 生成带有静态初始化块的Foo类 Class<?> fooClass = new ByteBuddy() .subclass(Object.class) .name("Foo") // 向静态块中添加打印逻辑 .initializer(MethodCall.invoke(System.class.getMethod("out")) .invoke(ElementMatchers.named("println"), "Static block executed!")) .make() .load(StaticInitializerDemo.class.getClassLoader()) .getLoaded(); // 触发类初始化,执行静态块 Class.forName(fooClass.getName()); } }
自定义复杂初始化逻辑
如果需要执行更复杂的自定义代码,可以直接调用自定义工具类的静态方法,示例如下:
// 自定义初始化工具类 class InitTools { public static void customInit() { // 这里编写任意初始化逻辑 System.out.println("Custom static initialization logic running"); } } // ByteBuddy生成代码 Class<?> fooClass = new ByteBuddy() .subclass(Object.class) .name("Foo") .initializer(MethodCall.invoke(InitTools.class.getMethod("customInit"))) .make() .load(ClassLoader.getSystemClassLoader()) .getLoaded();
内容的提问来源于stack exchange,提问作者andreoss
相关产品推荐
相关产品推荐

