Ответ 1
Зачем вам нужно бросить? О Spring использование прокси - это отличная статья, я предлагаю вам прочитать ее и комментарии.
А также раздел прокси (7.1.3) из Spring документации AOP.
Я использую Spring, в какой-то момент я хотел бы передать объект в его фактическую реализацию выполнения.
Пример:
Class MyClass extends NotMyClass {
InterfaceA a;
InterfaceA getA() { return a; }
myMethod(SomeObject o) { ((ImplementationOfA) getA()).methodA(o.getProperty()); }
}
Это кричит a ClassCastException
, так как a
является объектом $ProxyN
. Хотя в beans.xml я ввел bean, который имеет класс ImplementationOfA
.
РЕДАКТИРОВАТЬ 1
Я расширил класс, и мне нужно вызвать метод в ImplementationOfA
. Поэтому я думаю, что мне нужно бросить. Метод получает параметр.
РЕДАКТИРОВАТЬ 2
Лучше сорвать целевой класс:
private T getTargetObject(Object proxy, Class targetClass) throws Exception {
while( (AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget(), targetClass);
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
Я знаю, что это не очень элегантно, но работает.
Все кредиты http://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/ Спасибо!
Зачем вам нужно бросить? О Spring использование прокси - это отличная статья, я предлагаю вам прочитать ее и комментарии.
А также раздел прокси (7.1.3) из Spring документации AOP.
Для меня версия от EDIT 2 не работала. Ниже работало:
@SuppressWarnings({"unchecked"})
protected <T> T getTargetObject(Object proxy) throws Exception {
while( (AopUtils.isJdkDynamicProxy(proxy))) {
return (T) getTargetObject(((Advised)proxy).getTargetSource().getTarget());
}
return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
}
Использование:
UserServicesImpl serviceImpl = getTargetObject(serviceProxy);
serviceImpl.setUserDao(userDAO);
Теперь вы можете использовать
AopTestUtils.getTargetObject(proxy)
.
Реализация та же, что и у @siulkilulki sugestion, но это на Spring helper
В основном, когда вы используете AOP в Spring, Spring создает Proxy для вас. У вас есть два варианта:
Ключевым моментом здесь является то, что когда аспект применяется к вашему бобу, Spring создает экземпляр прокси, и если вы попытаетесь выполнить приведение, вы получите исключение.
Я надеюсь, что это может помочь вам