Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Dynamic proxy: вызов вложенных методов из проксируемого класса. / 5 сообщений из 5, страница 1 из 1
12.11.2012, 18:41:46
    #38035187
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic proxy: вызов вложенных методов из проксируемого класса.
Здравствуйте, появился вопрос. У меня есть класс, и для него Dynamic proxy и InvocationHandler. Вот класс:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Victim implements IVictim{
    @Override
    public void f() {
       System.out.println("Victim f()");
    }
    @Override
    public void g() {
        System.out.println("Victim g()");
        f();
     }
 }


InvocationHandler как в примере у оракла. Я ожидал, что при вызове метода g() прокси перехватит и g() и f(), но этого не происходит. Видимо я неправильно понял или не понял что-то фундаментальное. Подскажите, что именно, пожалуйста.
...
Рейтинг: 0 / 0
12.11.2012, 19:04:38
    #38035205
Dynamic proxy: вызов вложенных методов из проксируемого класса.
хорошо бы увидеть хоть какой-то код: код InvocationHandler, код создания объекта-прокси

>>ожидал, что при вызове метода g() прокси перехватит и g() и f(), но этого не происходит
как понять "при вызове метода g() прокси перехватит и g() и f()"?
...
Рейтинг: 0 / 0
12.11.2012, 19:09:01
    #38035213
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic proxy: вызов вложенных методов из проксируемого класса.
Прокси ничего не "перехватывает". Он "оборачивает". В этом существенная разница.
Поэтому если вызвать proxy.f(), то вызовется InvocationHandler. А если вызвать intance.f(), то метод вызовется безовсяких прокси.
У вас там вызов this.f() напрямую, кончено же он мимо прокси идёт. Стандартный геморой в Spring/JEE.
...
Рейтинг: 0 / 0
12.11.2012, 19:13:52
    #38035216
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic proxy: вызов вложенных методов из проксируемого класса.
Коваленко Валентин,

как понять "при вызове метода g() прокси перехватит и g() и f()"?
вот так:
Код: java
1.
2.
3.
4.
5.
//g()
 public void g() {
        System.out.println("Victim g()");
        f();//<------вызов f()
     }


внутри g() вызывается f(). Оба метода интерфейсные, но вложенный вызов f() не перехватывается.

хорошо бы увидеть хоть какой-то код: код InvocationHandler, код создания объекта-прокси
код ровно как у оракла, создание прокси внутри - статический метод newInstance(Object obj)
Вот код хендлера:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class Master implements InvocationHandler{
   private Object obj;

    public static Object newInstance(Object obj) {
	return java.lang.reflect.Proxy.newProxyInstance(
	    obj.getClass().getClassLoader(),
	    obj.getClass().getInterfaces(),
	    new Master(obj));
    }

    private Master(Object obj) {
	this.obj = obj;
    }

    public Object invoke(Object proxy, Method m, Object[] args)
	throws Throwable
    {
        Object result;
	try {
	    System.out.println("before method " + m.getName());
	    result = m.invoke(obj, args);
        } catch (InvocationTargetException e) {
	    throw e.getTargetException();
        } catch (Exception e) {
	    throw new RuntimeException("unexpected invocation exception: " +
				       e.getMessage());
	} finally {
	    System.out.println("after method " + m.getName());
	}
	return result;
    }
}
...
Рейтинг: 0 / 0
12.11.2012, 19:15:06
    #38035218
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic proxy: вызов вложенных методов из проксируемого класса.
Blazkowicz,

Спасибо, иногда на очевидные вещи нужно тыкать пальцем.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Dynamic proxy: вызов вложенных методов из проксируемого класса. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]