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

时间:2016-12-29 02:15:08

标签: java proxy byte-buddy

使用ByteBuddy,我想为具有私有构造函数的类创建代理。这是班级:

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();
    }
}

1 个答案:

答案 0 :(得分:0)

对于不允许调用私有构造函数的Java字节代码,您无法做任何事情。您有两种选择:

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