如何在ByteBuddy的Advice包装方法中获取私有字段、调用私有方法
解决方案
- 私有字段获取:使用
@Advice.FieldValue注解直接注入目标私有字段的值,不需要通过实例手动调用,ByteBuddy会在字节码增强阶段直接生成对应字段的访问指令,不需要额外处理访问权限问题。 - 私有方法调用:使用
@Advice.Invoke注解注入目标私有方法的调用句柄,直接调用注入的句柄即可执行私有方法,同样无反射开销。
修改后的ChunkGeneratorAdvice实现代码如下:
@Advice.OnMethodExit public static void buildNoise(GeneratorAccess generatoraccess, StructureManager structuremanager, IChunkAccess ichunkaccess, @Advice.This ChunkGeneratorAbstract chunkGenerator, // 注入私有字段n的值,declaringType可省略,存在字段继承歧义时建议显式指定 @Advice.FieldValue("n") int val, // 注入无参私有方法privateMethod的调用句柄 @Advice.Invoke("privateMethod") Callable<Object> privateMethodInvoker) throws Exception { // 直接使用注入的字段值 System.out.println("私有字段n取值为:" + val); // 调用私有方法获取返回值 Object someVal = privateMethodInvoker.call(); }
补充说明:如果私有方法存在入参,将
Callable替换为匹配参数数量、类型的函数式接口即可,比如单参数用Function<参数类型, 返回值类型>,双参数用BiFunction<参数1类型, 参数2类型, 返回值类型>,自定义参数的可以自行编写对应函数式接口,ByteBuddy会自动匹配方法签名。
若你更习惯用反射实现,直接在Advice逻辑中通过反射获取字段/方法对象后设置setAccessible(true)也可实现,但是性能远低于注解实现方式,不推荐。
内容的提问来源于stack exchange,提问作者CatCoder
相关产品推荐
相关产品推荐

