8

我有以下代码可用于为实现支持的接口类型创建 Proxy 实例InvocationHandler,但是当我使用具体的类类型时,它不起作用,这是众所周知的,并记录在Proxy.newProxyInstance中:

    // NOTE: does not work because SomeConcreteClass is not an interface type
    final ClassLoader myClassLoader = SomeConcreteClass.getClassLoader();
    SomeConcreteClass myProxy = (SomeConcreteClass) Proxy.newProxyInstance(myClassLoader, new Class[] {
        SomeConcreteClass.class }, new InvocationHandler() { /* TODO */ });        

但是,如果我没记错的话,我已经在一些模拟框架中看到了这个用例,在这些框架中可以模拟一个具体的类类型,例如EasyMock。在检查他们的源代码之前,任何人都可以指出需要做什么来代理具体的类类型而不仅仅是接口?

4

1 回答 1

13

JDK 动态代理仅适用于接口。如果要创建具有具体超类的代理,则需要改用CGLIB之类的东西。

Enhancer e = new Enhancer();
e.setClassLoader(myClassLoader);
e.setSuperclass(SomeConcreteClass.class);
e.setCallback(new MethodInterceptor() {
  public Object intercept(Object obj, Method method, Object[] args,
        MethodProxy proxy) throws Throwable {
    return proxy.invokeSuper(obj, args);
  }
});
// create proxy using SomeConcreteClass() no-arg constructor
SomeConcreteClass myProxy = (SomeConcreteClass)e.create();
// create proxy using SomeConcreteClass(String) constructor
SomeConcreteClass myProxy2 = (SomeConcreteClass)e.create(
    new Class<?>[] {String.class},
    new Object[] { "hello" });
于 2013-01-11T11:52:42.037 回答