如何在Java中创建接口的代理?

vir*_*m03 4 java proxy mocking dynamic-proxy

如何在不创建实现它的类的情况下为接口创建代理?

我有一个具体的例子:我有一个接口,Contact,需要创建一个充当联系人的代理对象.此代理对象将用于运行一些TestNG测试.

我尝试过使用JDK方法,但只能找到需要实际实现该接口的示例.

我还发现jasssist可以帮助我解决这个问题,并尝试实现一个似乎有效的简单示例,直到我出现Out of Memory错误.这是我正在做的事情的片段:

import javassist.util.proxy.MethodFilter;
import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory

protected final T createMock(final Class<T> clazz) {
    final ProxyFactory factory = new ProxyFactory();
    factory.setInterfaces(new Class[] { clazz });
    factory.setFilter(new MethodFilter() {
        public final boolean isHandled(final Method m) {
            // ignore finalize()
            return !m.getName().equals("finalize");
        }
    });

    final MethodHandler handler = createDefaultMethodHandler();
    try {
        return (T) factory.create(new Class<?>[0], new Object[0], handler);
    } catch (final Exception e) {
        e.printStackTrace();
    }
    return null;
}
private MethodHandler createDefaultMethodHandler() {
    return new MethodHandler() {
        public final Object invoke(final Object self,
                final Method thisMethod, final Method proceed,
                final Object[] args) throws Throwable {
            System.out.println("Handling " + thisMethod
                    + " via the method handler");
            return thisMethod.invoke(self, args);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

请记住,createMock()方法的参数将是一个接口.

谢谢

小智 8

您可以使用该方法newProxyInstancejava.lang.reflect.Proxy.例如:

    Proxy.newProxyInstance(iClazz.getClassLoader(),
        new Class[]{iClazz},
        new YourInvocationHandler())
Run Code Online (Sandbox Code Playgroud)

iClazz是您的接口的类,YourInvocationHandler是一个实例java.lang.reflect.InvocationHandler


Arn*_*sch 1

如果您只对模拟感兴趣,我建议使用框架。

EasyMock ( http://easymock.org/ ) 或 JMock ( http://www.jmock.org/ ) 可能适合。

要自己创建代理,您可以使用该类java.lang.reflect.Proxy