Вы можете использовать динамический прокси. Пока проверенные исключения являются частью интерфейса, вы можете выбросить проверенные исключения из обработчика вызовов. В противном случае это недопустимо и создаст исключение UndeclaredThrowableException, которое переносит выброшенное проверенное исключение.
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();
Выход:
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)
С необъявленным отмеченным исключением для интерфейса 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