如何創建接口的代理而不創建實現它的類?如何在Java中創建接口的代理?
我有一個具體的例子:我有一個接口,聯繫人,並需要創建一個作爲聯繫人的代理對象。此代理對象將用於運行一些TestNG測試。
我嘗試過使用JDK方法,但只能找到需要該接口的實際實現的示例。
我還發現,jasssist可以幫助我解決這個問題,並試圖實現一個簡單的例子,似乎一直工作,直到我得到一個內存不足的錯誤。這裏是我正在做的一個片段:
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);
}
};
}
請記住,createMock()方法的參數將是一個接口。
謝謝
一個實例你爲什麼不理電話敲定?也許這與你的OutOfMemory異常有關! – Arne 2010-10-05 12:48:18
如果我考慮finalize()方法,則仍會出現該錯誤。我認爲問題在其他地方,因爲我在使用javassist和commons-proxy時遇到了同樣的錯誤。目前,我認爲我會爲每個需要測試的接口提供一個簡單的實現,因爲我在這個問題上投入了一些時間並可以使其工作。 – virgium03 2010-10-05 12:56:39