当 class 只有一个私有构造函数时,如何创建代理?

How can I create a proxy when the class having only one private constructor?

使用 ByteBuddy,我想为 class 创建一个具有私有构造函数的代理。那就是 class:

public class Foo {

    private Foo() {
    }
}

我试过写一些这样的代码但没有用?

public class CreateAndExecuteProxy {

    public static void main(String[] args) throws Exception {
        Constructor<?> superConstructor = Foo.class.getDeclaredConstructor();

        Class<? extends Foo> proxyType = new ByteBuddy()
                .subclass( Foo.class, ConstructorStrategy.Default.NO_CONSTRUCTORS )
                .defineConstructor( Visibility.PUBLIC )
                .intercept( MethodCall.invoke( superConstructor ).onSuper() )
                .make()
                .load( CreateAndExecuteProxy.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
                .getLoaded();

        Foo foo = proxyType.newInstance();
    }
}

对于不允许调用私有构造函数的 Java 字节代码,您实际上无能为力。您有两个选择:

  1. 使用 ByteBuddy::redefine 添加另一个构造函数,并使用代理或过早加载来强制此 class 进入您的 class 加载程序。
  2. 使用像 Objenesis 这样的库来创建实例而不调用构造函数。