2010-09-15 21 views
9

Come posso far sì che il proxy dinamico esegua il controllo delle eccezioni?Proxy dinamico e eccezioni controllate

Ho bisogno di un wrapper trasparente per un'interfaccia che a volte genera eccezioni controllate come IOException. È possibile senza AOP di terze parti o scrivere il mio proxy? Anche la modifica manuale di tutti e 20 i metodi dell'interfaccia non è un'opzione.

risposta

10

È possibile utilizzare un proxy dinamico. Finché le eccezioni controllate fanno parte dell'interfaccia, è possibile lanciare le eccezioni controllate dal gestore di chiamata. Altrimenti ciò è illegale e creerà un'eccezione UndeclaredThrowable che avvolge l'eccezione verificata generata.

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(); 

uscita:

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) 

Con un'eccezione non dichiarato controllato per l'interfaccia 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

Grazie. Una nota, Method.invoke() (spesso usata in 'InvocationHandler.invoke()' avvolge l'eccezione originale in 'InvocationTargetException', quindi deve essere srotolata –

1

Un proxy dinamica può lanciare un'eccezione controllata se l'eccezione è dichiarato nella firma del metodo dell'interfaccia è proxy. Da Sun's Dynamic Proxy reference:

Se un'eccezione viene generata dal metodo invoke, verrà generata anche dall'invocazione del metodo sull'istanza proxy.

Il tipo di eccezione deve essere assegnabile a uno qualsiasi dei tipi di eccezione dichiarati nella firma del metodo di interfaccia o per i tipi di eccezione non controllate java.lang.RuntimeException o java.lang.Error.

Se viene generata un'eccezione controllata invocata che non è assegnabile a nessuno dei tipi di eccezione dichiarati nella clausola throws del metodo di interfaccia, un UndeclaredThrowableException verrà generato dall'invocazione del metodo sull'istanza proxy. Il UndeclaredThrowableException verrà costruito con l'eccezione generata dal metodo invoke.

17

Quello che probabilmente stai cercando è questo, come Konrad cita sopra:

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(); 
    } 
} 

Fonte

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

+0

il link al blog esterno sopra è sparito, ma per es. Https: //amitstechblog.wordpress.com/2011/07/24/java-proxies-and-undeclaredthrowableexception/ ha anche alcuni motivi per cui è una buona idea farlo – vorburger

Problemi correlati