在方法中用另一个字段替换一个字段

Replace one field with another in a method

我正在尝试用另一个字段引用动态替换方法主体中的一个字段引用。 bytebuddy 可以吗?

我喜欢改造的class是这样的:

public class TestReplace {
    @replace
    int a = 1;
    int b = 2;

    public int printA() {
        return a;
    }

    public int printB() {
        return b;
    }
}

转换在于替换访问它们的方法中标有@replace 的变量。替换将由我将插入的变量完成。

已经转换的class应该是这样的:

public class TestReplace {
    @replace
    int a = 1;
    int ___a = a * 10; // var inserted
    int b = 2;

    public int printA() {
        return ___a;
    }

    public int printB() {
        return b;
    }
}

我是这个主题的新手,如果您能给我任何帮助,我将不胜感激。

提前致谢

是的,这可以使用 MemberSubstitution:

MemberSubstitution.relaxed()
  .field(ElementMatchers.named("a"))
  .onRead()
  .doReplaceWith(otherField)

例如,您可以从使用 AgentBuilder API 定义的 Java 代理应用此转换。您可能还需要定义此代理的替代字段。您可以使用 FieldDescription.Latent.

引用此字段