Динамический прокси и проверенные исключения - PullRequest
10 голосов
/ 15 сентября 2010

Как сделать, чтобы мой динамический прокси-сервер выбрасывал проверенные исключения?

Мне нужна прозрачная оболочка для интерфейса, который иногда выдает проверенные исключения, например IOException.Возможно ли это без стороннего AOP или написания моего собственного прокси?Изменение всех 20 методов интерфейса вручную также не вариант.

Ответы [ 3 ]

17 голосов
/ 23 мая 2012

Что вы, вероятно, ищете, так это, как Конрад упоминает выше:

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

Источник: https://web.archive.org/web/20120130204437/http://benpryor.com/blog/2006/08/15/java-dynamic-proxies-and-invocationtargetexception/

11 голосов
/ 15 сентября 2010

Вы можете использовать динамический прокси. Пока проверенные исключения являются частью интерфейса, вы можете выбросить проверенные исключения из обработчика вызовов. В противном случае это недопустимо и создаст исключение 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
1 голос
/ 15 сентября 2010

Динамический прокси может генерировать проверенное исключение, если исключение объявлено в сигнатуре метода интерфейса, который он передает. От Солнца Ссылка на Динамический прокси :

Если исключение выдается методом invoke, оно также будет вызвано вызовом метода в экземпляре прокси.

Тип исключения должен быть назначен любому из типов исключений, объявленных в сигнатуре метода интерфейса, или непроверенным типам исключений java.lang.RuntimeException или java.lang.Error.

Если проверяемое исключение генерируется вызовом, который не может быть назначен ни одному из типов исключений, объявленных в предложении throws метода интерфейса, то UndeclaredThrowableException будет вызвано вызовом метода в экземпляре прокси. UndeclaredThrowableException будет создан за исключением того, что было сгенерировано методом invoke.

...