2016-12-29 90 views
0

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

回答

0

对于不允许调用私有构造函数的Java字节代码,没有什么可以做的。有你有两个选择:

  1. 使用ByteBuddy::redefine添加另一个构造函数,或者使用代理或过早加载至这一类强行进入你的类加载器。
  2. 使用类似Objenesis的库来创建实例而不调用构造函数。
相关问题