ByteBuddy 通过参数转换调用同一类中的构造函数

问题描述 投票:0回答:3

我有一个与此类似的Java类:

public class A {

    public A(int a) {
        // ...
    }

    public A(String a) {
        // ...
    }

}

鉴于我无法编辑该类或创建它的子类,我想使用 byte-buddy 实现以下目标:

public A(int a) {
    this(Integer.toString(a));
}

我尝试过 Advice 和 MethodDelegation 但没有成功。通过 byte-buddy 实现这一目标的正确方法是什么?

java byte-buddy
3个回答
1
投票

构造函数的特殊之处在于它们不允许从外部调用超级构造函数。如果您重新定义该方法,则可以使用 MethodCall 来定义这样的构造函数。

您需要定义对超级构造函数的方法调用,该构造函数接受对唯一参数上的 toString 方法的方法调用。


1
投票

感谢 Rafael Winterhalter 建议的方法,我通过以下方式实现了我想要的:

new ByteBuddy().redefine(A.class)
                    .constructor(isConstructor().and(takesArgument(0, int.class)))
                    .intercept(invoke(isConstructor().and(takesArguments(String.class)))
                            .withMethodCall(invoke(Integer.class.getMethod("toString", int.class)).withArgument(0))
                    );

0
投票

谢谢。 你的 invoke 方法来自哪里?由字节伙伴提供? 你能发布完整的代码片段吗?以下不起作用。

        new ByteBuddy().redefine(CassandraConnector.class)
            .constructor(ElementMatchers.isConstructor().and(ElementMatchers.takesArgument(0, CassandraConnectorConf.class)))
            .intercept(invoke(ElementMatchers.isConstructor().and(ElementMatchers.takesArguments(CassandraConnectorConf.class)))
                .withMethodCall(invoke(CassandraConnectorConf.class.getMethod("toString", int.class)).withArgument(0))
            );

© www.soinside.com 2019 - 2024. All rights reserved.