byte-buddy - 如何在 Advice 包装方法中获取私有字段并调用私有方法?
问题描述
重新定义方法:
private <T> void redefine(Class<T> type, UnaryOperator<DynamicType.Builder<T>> operation) {
DynamicType.Builder<T> builder = new ByteBuddy().redefine(type);
ClassLoader systemClassLoader = Entity.class.getClassLoader();
operation
.apply(builder)
.make()
.load(systemClassLoader, ClassReloadingStrategy.fromInstalledAgent());
}
使用建议:
redefine(ChunkGeneratorAbstract.class, builder -> builder
.method(named("buildNoise")
.and(takesArguments(3)))
.intercept(Advice.to(ChunkGeneratorAdvice.class).wrap(StubMethod.INSTANCE)));
块生成器建议:
@Advice.OnMethodExit
public static void buildNoise(GeneratorAccess generatoraccess, StructureManager structuremanager, IChunkAccess ichunkaccess,
@Advice.This ChunkGeneratorAbstract chunkGenerator) {
int val = chunkGenerator.n;
Object someVal = chunkGenerator.privateMethod();
}
chunkGenerator.n是一个私有字段。如何获得它的价值?
另外,我如何调用像chunkGenerator.privateMethod()这样的私有方法?
解决方案
对于私有字段,您可以将Advice.FieldValue
其用作参数上的注释以对其进行读取和写入。对于方法调用,您需要使用MemberSubstitution
. 然后,您将在通知类中声明一个具有相同签名的空方法,并从您的通知代码中调用此方法。稍后,您将使用MemberSubstitution
切换方法调用。
推荐阅读
- postgresql - 如何声明一个变量作为函数的结果?
- kubernetes - 入口配置原因所有后端服务都处于不健康状态
- javascript - 检测悬空承诺的静态/动态方法
- google-cloud-platform - 在 Google Cloud 中运行 Prefect flow serverless 的最佳实践
- php - 表单突然停止插入数据 - 这段代码有什么问题?
- python - CUDA Toolkit 是特定于 conda 环境的 cuDNN 吗?
- zsh - zsh:没有这样的文件或目录:
- php - 获取本月工资的未付员工 id 用于 codeigniter 的 sql 查询
- python - python shell 在运行 print() 时出现语法错误,但是在 jupytr notebook 中执行相同的代码
- sql - 尝试使用触发器