2010-09-15 17 views
9

Comment puis-je faire en sorte que les vérifications dynamiques de jetons proxy soient vérifiées?Proxy dynamique et exceptions vérifiées

J'ai besoin d'un wrapper transparent pour une interface qui jette parfois des exceptions vérifiées telles que IOException. Est-il possible sans AOP de tiers ou d'écrire mon propre proxy? La modification manuelle des 20 méthodes de l'interface n'est pas non plus une option.

Répondre

10

Vous pouvez utiliser un proxy dynamique. Tant que les exceptions vérifiées font partie de l'interface, vous pouvez lancer les exceptions vérifiées depuis le gestionnaire d'invocation. Sinon, ceci est illégal et créera une exception UndeclaredThrowableException qui encapsule l'exception vérifiée levée.

interface A{ 
    void x() throws IOException; 
} 

A proxy = (A) newProxyInstance(classLoader, new Class<?>[]{A.class}, 
    new InvocationHandler() {  
     @Override 
     public Object invoke(Object arg0, Method arg1, Object[] arg2) 
      throws Throwable { 
      throw new IOException(); 
     } 
    } 
); 
proxy.x(); 

sortie:

Exception in thread "main" java.io.IOException 
at X$1.invoke(X.java:19) 
at $Proxy0.x(Unknown Source) 
at X.main(X.java:22) 

Avec une exception vérifiée au noir pour l'interface A:

interface A{ 
    void x(); 
} 

Exception in thread "main" java.lang.reflect.UndeclaredThrowableException 
    at $Proxy0.x(Unknown Source) 
    at X.main(X.java:22) 
Caused by: java.io.IOException 
    at X$1.invoke(X.java:19) 
    ... 2 more 
+10

Merci. Une note, Method.invoke() (souvent utilisée dans 'InvocationHandler.invoke()' enveloppe l'exception d'origine dans 'InvocationTargetException', elle doit donc être dépliée.) –

1

Un proxy dynamique peut jeter exception vérifiée si l'exception est déclaré dans la signature de la méthode de l'interface, il est mandataire. De l'Dynamic Proxy reference Sun:

Si une exception est levée par la méthode Invoke, il sera également jeté par l'invocation de méthode sur l'instance proxy.

Le type d'exception doit pouvoir être affecté à l'un des types d'exception déclarés dans la signature de la méthode d'interface ou aux types d'exception non contrôlés java.lang.RuntimeException ou java.lang.Error.

Si une exception vérifiée est lancée par invocation qui ne peut être affectée à aucun des types d'exception déclarés dans la clause throws de la méthode interface, un UndeclaredThrowableException sera lancé par l'appel de méthode sur l'instance de proxy. Le UndeclaredThrowableException sera construit avec l'exception qui a été lancée par la méthode invoke.

17

Ce que vous cherchez probablement est-ce, comme Konrad mentionne ci-dessus:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
    try { 
     Object value = method.invoke(delegate, args); 
     return value; 
    } 
    catch (InvocationTargetException ex) { 
     throw ex.getCause(); 
    } 
} 

Source: http://benpryor.com/blog/2006/08/15/java-dynamic-proxies-and-invocationtargetexception/

+0

le lien vers le blog externe ci-dessus a disparu, mais par exemple https: //amitstechblog.wordpress.com/2011/07/24/java-proxies-and-undeclaredthrowableexception/ a aussi quelques commentaires sur pourquoi c'est une bonne idée de le faire – vorburger