首页 > 解决方案 > 如何在 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()这样的私有方法?

标签: byte-buddy

解决方案


对于私有字段,您可以将Advice.FieldValue其用作参数上的注释以对其进行读取和写入。对于方法调用,您需要使用MemberSubstitution. 然后,您将在通知类中声明一个具有相同签名的空方法,并从您的通知代码中调用此方法。稍后,您将使用MemberSubstitution切换方法调用。


推荐阅读