2016-12-29 91 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的庫來創建實例而不調用構造函數。
相關問題