Как получить имя прокси-класса? - PullRequest
1 голос
/ 14 января 2011

Я впервые использую java.util.concurrency framework. Вот очень упрощенная версия того, что я делаю. Для тех, кто не совсем знаком с фреймворком, future.get() выполняет объект Callable, определенный в будущем. future.getOriginatingRequest() возвращает объект, который я установил в будущем для использования объектом Callable, и я просто пытаюсь записать, какой объект исходного запроса не удался (достаточно знать его имя класса).

try {
  future.get();
} catch (ExecutionException e) {
  logger.error("Failed to execute future with id '" +
            future.getOriginatingRequest().getClass().getName() + "'");
}

Проблема, с которой я столкнулся, заключается в том, что каркас журналирования выводит следующее:

Failed to execute future with id '$Proxy22'

Таким образом, вместо реального имени класса я получаю $Proxy22 или какой-то другой номер. Есть ли способ получить реальное имя класса, а не имя прокси? Бонусные баллы - это то, что кто-то может четко объяснить, почему я получаю строку прокси!

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Я могу ответить на бонусный вопрос: строка - это имя динамического Proxy класса, сгенерированного во время выполнения.

Что касается того, как вы можете добраться до замаскированного класса, нет даже гарантии, что он вообще существует. Единственное, что вы можете сделать, это вызвать Proxy.getInvocationHandler() на вашем прокси-объекте и надеяться, что обработчик вызова покажет больше информации (маловероятно, но, возможно, того стоит).

1 голос
/ 17 июля 2013

Я нашел хорошее решение для http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/

@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
  if (AopUtils.isJdkDynamicProxy(proxy)) {
    return (T) ((Advised)proxy).getTargetSource().getTarget();
  } else {
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
  }
}

Использование

@Override
protected void onSetUp() throws Exception {
  getTargetObject(fooBean, FooBeanImpl.class).setBarRepository(new MyStubBarRepository());
}
0 голосов
/ 14 января 2011

Я предполагаю, что прокси-класс является подклассом класса, который вы ищете.особенно если вы ищете класс, который вы написали.

можете ли вы получить доступ к дереву наследования для найденного объекта?может быть, через отражение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...