Comment créer un proxy pour une interface sans créer une classe qui l'implémente?Comment créer un proxy d'une interface en Java?
J'ai un exemple concret: J'ai une interface, Contact, et j'ai besoin de créer un objet proxy qui agit comme un Contact. Cet objet proxy sera utilisé pour exécuter certains tests TestNG.
J'ai essayé d'utiliser l'approche JDK mais je n'ai trouvé que des exemples nécessitant une implémentation réelle de cette interface.
J'ai également trouvé que jasssist peut m'aider dans ce problème et a essayé d'implémenter un exemple simple qui semble fonctionner jusqu'à ce que j'obtienne une erreur de mémoire insuffisante. Voici un extrait de ce que je fais:
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);
}
};
}
Rappelez-vous que le paramètre de la méthode createMock() sera une interface.
Merci
Pourquoi ignorer-vous des appels à mettre la dernière main? Peut-être que cela a quelque chose à voir avec vos exceptions OutOfMemory !? – Arne
L'erreur se produit toujours si je prends en considération la méthode finalize(). Je pense que le problème est ailleurs, parce que j'obtiens les mêmes erreurs en utilisant javassist et commons-proxy. Pour le moment, je pense que je fournirai une implémentation simple pour chaque interface qui doit être testée parce que j'ai investi du temps dans ce problème et que je pourrais le faire fonctionner. – virgium03