如何使用ByteBuddy使用1+ args构造函数对抽象类进行子类化

时间:2018-08-26 08:45:49

标签: java byte-buddy

我想代理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)中使用该代码就可以了。承包商有一个简单的问题,不确定如何去做。

1 个答案:

答案 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的第二个参数来避免这种创建。