如果代理类具有package-private默认构造函数,则代理实例化将失败

时间:2016-02-17 11:51:46

标签: java proxy byte-buddy

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

所以我试图将公共默认构造函数添加到我的代理类型,拦截其调用并委托给超类型构造函数。尽管在生成的构造函数中有IllegalAccessException,但这会失败:

Exception in thread "main" java.lang.IllegalAccessError:
tried to access method com.example.proxy.test.Foo.&lt;init&gt;()V from class com.example.proxy.test.Foo$ByteBuddy$65mxf95M
  com.example.proxy.test.Foo$ByteBuddy$65mxf95M.&lt;init&gt;(Unknown Source)
  ...
  at java.lang.Class.newInstance(Class.java:442)
  at com.example.proxy.test.CreateAndExecuteProxy.main(CreateAndExecuteProxy.java:33)

由于代理与代理类位于同一个包中,因此我不清楚调用失败的原因。我在这做错了什么?是否有另一种方法让代理调用具有默认可见性的超级构造函数?

1 个答案:

答案 0 :(得分:2)

这两个类由两个不同的类加载器加载。请将您的策略​​更改为INJECTION并尝试。

ClassLoadingStrategy.Default.INJECTION