我想代理java.net.HttpURLConnection,它有一个构造函数:HttpURLConnection(URL u)
。如何在不使用non-arg构造函数创建自定义“ Empty”类的情况下,使用 ByteBuddy 子类化此类?
new ByteBuddy().subclass(HttpURLConnection.class)
.method(ElementMatchers.any())
.intercept(InvocationHandlerAdapter.of(proxyHandler))
.make()
.load(HttpURLConnection.class.getClassLoader())
.getLoaded()
.newInstance();
当前,由于以下原因导致失败
Caused by: java.lang.NoSuchMethodException: net.bytebuddy.renamed.java.net.HttpURLConnection$ByteBuddy$Mr8B9wE2.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
我想将自定义URL
委托给该超级构造函数,这是可能的。
但是如果我创建一个自定义类
public class ProxiedHttpURLConnection extends HttpURLConnection{
protected ProxiedHttpURLConnection() {
super(null); // <---
}
}
,并在new ByteBuddy().subclass(ProxiedHttpURLConnection.class)
中使用该代码就可以了。承包商有一个简单的问题,不确定如何去做。
答案 0 :(得分:2)
您可以定义自定义构造函数,并使用MethodCall
工具来调用特定的超级构造函数,例如
builder = builder.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(HttpURLConnection.class.getDeclaredConstructor(URL.class))
.with((Object) null))
默认情况下,Byte Buddy模仿超类构造函数,因此您可以查找一个声明的构造函数,该构造函数采用URL并手动提供null参数。
您可以通过将ConstructorStrategy
定义为subclass
的第二个参数来避免这种创建。