如何使用 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 的第二个参数来避免这种创建。