我有一个与此类似的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 实现这一目标的正确方法是什么?
构造函数的特殊之处在于它们不允许从外部调用超级构造函数。如果您重新定义该方法,则可以使用 MethodCall 来定义这样的构造函数。
您需要定义对超级构造函数的方法调用,该构造函数接受对唯一参数上的 toString 方法的方法调用。
感谢 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))
);
谢谢。 你的 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))
);