如果代理 class 具有包私有默认构造函数,则代理实例化失败
Proxy instantiation fails if proxied class has package-private default constructor
我想使用 ByteBuddy 为具有包私有默认构造函数的类型创建代理。那是类型:
public class Foo {
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.WRAPPER)
.getLoaded();
Foo foo = proxyType.newInstance();
}
}
所以我试图将 public 默认构造函数添加到我的代理类型,拦截它的调用并委托给超类型构造函数。虽然在生成的构造函数中使用 IllegalAccessException
失败:
Exception in thread "main" java.lang.IllegalAccessError:
tried to access method com.example.proxy.test.Foo.<init>()V from class com.example.proxy.test.Foo$ByteBuddymxf95M
com.example.proxy.test.Foo$ByteBuddymxf95M.<init>(Unknown Source)
...
at java.lang.Class.newInstance(Class.java:442)
at com.example.proxy.test.CreateAndExecuteProxy.main(CreateAndExecuteProxy.java:33)
由于代理与被代理 class 在同一个包中,我不清楚调用失败的原因。我在这里做错了什么?还有另一种方法可以让代理调用具有默认可见性的超级构造函数吗?
classes 正在由两个不同的 class 加载器加载。请将您的策略更改为 INJECTION 并尝试。
ClassLoadingStrategy.Default.INJECTION
我想使用 ByteBuddy 为具有包私有默认构造函数的类型创建代理。那是类型:
public class Foo {
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.WRAPPER)
.getLoaded();
Foo foo = proxyType.newInstance();
}
}
所以我试图将 public 默认构造函数添加到我的代理类型,拦截它的调用并委托给超类型构造函数。虽然在生成的构造函数中使用 IllegalAccessException
失败:
Exception in thread "main" java.lang.IllegalAccessError:
tried to access method com.example.proxy.test.Foo.<init>()V from class com.example.proxy.test.Foo$ByteBuddymxf95M
com.example.proxy.test.Foo$ByteBuddymxf95M.<init>(Unknown Source)
...
at java.lang.Class.newInstance(Class.java:442)
at com.example.proxy.test.CreateAndExecuteProxy.main(CreateAndExecuteProxy.java:33)
由于代理与被代理 class 在同一个包中,我不清楚调用失败的原因。我在这里做错了什么?还有另一种方法可以让代理调用具有默认可见性的超级构造函数吗?
classes 正在由两个不同的 class 加载器加载。请将您的策略更改为 INJECTION 并尝试。
ClassLoadingStrategy.Default.INJECTION