2010-09-15 7 views
9

Wie kann ich meinen dynamischen Proxy durch Überprüfungsausnahmen überprüfen lassen?Dynamischer Proxy und geprüfte Ausnahmen

Ich brauche einen transparenten Wrapper für eine Schnittstelle, die manchmal überprüft Ausnahmen wie IOException wirft. Ist es möglich ohne AOP von Drittanbietern oder meinen eigenen Proxy zu schreiben? Eine manuelle Änderung aller 20 Methoden der Schnittstelle ist ebenfalls nicht möglich.

Antwort

10

Sie können einen dynamischen Proxy verwenden. Solange die geprüften Ausnahmen Teil der Schnittstelle sind, können Sie die geprüften Ausnahmen vom Aufruf-Handler abwerfen. Andernfalls ist dies illegal und es wird eine UndeclaredThrowableException erstellt, die die ausgelöste, geprüfte Ausnahme umschließt.

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

Ausgang:

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) 

Mit einer nicht angemeldeten geprüfte Ausnahme für Schnittstelle 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

Dank. Eine Anmerkung, Method.invoke() (häufig in 'InvocationHandler.invoke()' verwendet, umschließt die ursprüngliche Ausnahme in 'InvocationTargetException', also muss sie ausgepackt werden. –

1

Eine dynamische Proxy-geprüfte Ausnahme werfen kann, wenn die Ausnahme in der Signatur der Methode deklariert wird der Schnittstelle ist es Proxying. Von der Sonne Dynamic Proxy reference:

Wenn eine Ausnahme von der Methode invoke ausgelöst wird, wird sie auch vom Methodenaufruf der Proxy-Instanz ausgelöst.

Der Typ der Ausnahme muss entweder einem der in der Signatur der Schnittstellenmethode deklarierten Ausnahmetypen oder den nicht aktivierten Ausnahmetypen java.lang.RuntimeException oder java.lang.Error zuweisbar sein.

Wenn eine geprüfte Ausnahme durch Aufruf ausgelöst wird, die keinem der in der throws-Klausel der Schnittstellenmethode deklarierten Ausnahmetypen zuweisbar ist, wird durch den Methodenaufruf auf der Proxy-Instanz ein UndeclaredThrowableException ausgelöst. Das UndeclaredThrowableException wird mit der Ausnahme erstellt, die von der Invoke-Methode ausgelöst wurde.

17

Was Sie wahrscheinlich für suchen, ist dies, wie Konrad oben erwähnt:

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

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

+0

Der Link zum externen Blog oben ist weg, aber zB https: //amitschtechblog.wordpress.com/2011/07/24/java-proxies-and-undeclaredthrowableexception/ hat auch einige Hinweise darauf, warum es eine gute Idee ist, dies zu tun – vorburger