使用其他字段的ByteBuddy实现方法

时间:2018-10-08 23:00:34

标签: java byte-buddy

我的用例是实现一种将某些字段与字符串串联在一起的方法。基本上等同于:

String doAThing(){
 return this.a + " " + this.b;
}

在示例中,我只能找到静态值(例如https://github.com/raphw/byte-buddy/blob/master/byte-buddy-dep/src/test/java/net/bytebuddy/ByteBuddyTutorialExamplesTest.java处的堆栈操作)

谢谢!

1 个答案:

答案 0 :(得分:0)

如果要加入的字段是已知的,不需要动态发现,则可以尝试使用 @FieldValue

public class Test {

    public static void main(String[] args) throws Exception {
        String name = Inner.class.getName() + "_bb";

        new ByteBuddy()
            .redefine(Inner.class)
            .name(name)
            .defineMethod("doAThing", String.class, Opcodes.ACC_PUBLIC)
            .intercept(to(new Interceptor()))
            .make()
            .load(Test.class.getClassLoader());

        Object instance = Class.forName(name).newInstance();
        Method m = instance.getClass().getMethod("doAThing");
        System.out.println(m.invoke(instance));
    }

    public static class Interceptor {
        public String doAThing(@FieldValue("a") @RuntimeType Object a, @FieldValue("b") @RuntimeType Object b) {
            return a + "_" + b;
        }
    }

    public static class Inner {
        private String a = "a";
        private String b = "b";
    }
}