È 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
fonte
2010-09-15 06:55:19
Grazie. Una nota, Method.invoke() (spesso usata in 'InvocationHandler.invoke()' avvolge l'eccezione originale in 'InvocationTargetException', quindi deve essere srotolata –