如何使用 ByteBuddy 使用 1+ args 构造函数子 class 抽象 class
How to subclass an abstract class with 1+ args constructor using ByteBuddy
我想代理 java.net.HttpURLConnection,它有一个构造函数:HttpURLConnection(URL u)
。如何在不使用非参数构造函数创建自定义 "Empty" class 的情况下,如何使用 ByteBuddy subclass 这样的 class?
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
委托给该超级构造函数是可能的。
但是如果我创建自定义 class
public class ProxiedHttpURLConnection extends HttpURLConnection{
protected ProxiedHttpURLConnection() {
super(null); // <---
}
}
并在 new ByteBuddy().subclass(ProxiedHttpURLConnection.class)
中使用它,效果很好。承包商有一个简单的问题,不太确定如何去做。
您可以定义自定义构造函数并使用 MethodCall
工具调用特定的超级构造函数,例如
builder = builder.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(HttpURLConnection.class.getDeclaredConstructor(URL.class))
.with((Object) null))
默认情况下,Byte Buddy 模仿超级 class 构造函数,因此您可以查找声明的构造函数,该构造函数采用 URL 并手动提供 null 参数。
您可以通过将 ConstructorStrategy
定义为 subclass
的第二个参数来避免这种创建。
我想代理 java.net.HttpURLConnection,它有一个构造函数:HttpURLConnection(URL u)
。如何在不使用非参数构造函数创建自定义 "Empty" class 的情况下,如何使用 ByteBuddy subclass 这样的 class?
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
委托给该超级构造函数是可能的。
但是如果我创建自定义 class
public class ProxiedHttpURLConnection extends HttpURLConnection{
protected ProxiedHttpURLConnection() {
super(null); // <---
}
}
并在 new ByteBuddy().subclass(ProxiedHttpURLConnection.class)
中使用它,效果很好。承包商有一个简单的问题,不太确定如何去做。
您可以定义自定义构造函数并使用 MethodCall
工具调用特定的超级构造函数,例如
builder = builder.defineConstructor(Visibility.PUBLIC)
.intercept(MethodCall.invoke(HttpURLConnection.class.getDeclaredConstructor(URL.class))
.with((Object) null))
默认情况下,Byte Buddy 模仿超级 class 构造函数,因此您可以查找声明的构造函数,该构造函数采用 URL 并手动提供 null 参数。
您可以通过将 ConstructorStrategy
定义为 subclass
的第二个参数来避免这种创建。