当 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 字节代码,您实际上无能为力。您有两个选择:
- 使用
ByteBuddy::redefine
添加另一个构造函数,并使用代理或过早加载来强制此 class 进入您的 class 加载程序。
- 使用像 Objenesis 这样的库来创建实例而不调用构造函数。
使用 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 字节代码,您实际上无能为力。您有两个选择:
- 使用
ByteBuddy::redefine
添加另一个构造函数,并使用代理或过早加载来强制此 class 进入您的 class 加载程序。 - 使用像 Objenesis 这样的库来创建实例而不调用构造函数。