|
|
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Изучаю java по книге "Java. Библиотека профессионала Хорстманн, Корнелл" в книге приведен пример трассировки вызова методов объекта используя прокси-класс. Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Пример полностью рабочий. Это работает: Код: java 1. но почему в таком случае не работает?! Код: java 1. Выдаются ошибки: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 12:05 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13, Научитесь читать исключения. Исключение, которое указывает на проблему следующее: Код: java 1. 2. 3. А не то что вы привели. Объяснять надо исключение или понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 13:28 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczll13, Научитесь читать исключения. Исключение, которое указывает на проблему следующее: Код: java 1. 2. 3. А не то что вы привели. И более того, оно даже указывает имя класса и номер строки где возникла проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 13:51 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Garrick, Blazkowicz Насколько я понимаю исключение вызвано невозможностью приведения типа com.sun.proxy.$Proxy0 к java.lang.Integer Но я никак не могу понять что привело к данной ситуации? Как локализовать и исправить ошибку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 15:18 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13Но я никак не могу понять что привело к данной ситуации? Как локализовать и исправить ошибку? Это очень грустно слышать. У вас есть массив Proxy. Для сортировки нужно сравнивать разные элементы коллекции друг с другом. Для сравнения вызывается метод Comparable.compareTo(). То есть у экземпляра Proxy вызывается метод compareTo и аргументом метода передаётся другой Proxy. InvocationHandler перехватывает вызов, чего-то там логирует и вызывает метод делегата (у вас о почему-то target). В target у вас хранится Integer, значит method.invoke(target, args); вызывает Integer.compareTo(args) В args у вас Proxy. А Integer.compareTo() ожидает только Integer. Зачем у вас переменные типа Object для хранения Integer это вопрос открытый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 15:27 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczУ вас есть массив Proxy. Для сортировки нужно сравнивать разные элементы коллекции друг с другом. Для сравнения вызывается метод Comparable.compareTo(). То есть у экземпляра Proxy вызывается метод compareTo и аргументом метода передаётся другой Proxy. InvocationHandler перехватывает вызов, чего-то там логирует и вызывает метод делегата (у вас о почему-то target). В target у вас хранится Integer, значит method.invoke(target, args); вызывает Integer.compareTo(args) В args у вас Proxy. А Integer.compareTo() ожидает только Integer. Спасибо, проблему понял... Каким образом можно "правильно" реализовать подобную логику логирования? Где можно посмотреть корректный пример? Зачем у вас переменные типа Object для хранения Integer это вопрос открытый. Вопрос этот не ко мне а к авторам книги "Java. Библиотека профессионала Хорстманн, Корнелл" Пишу ещё раз: Изучаю java по книге "Java. Библиотека профессионала Хорстманн, Корнелл"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 15:59 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13, Логирование реализовано правильно. Не правильно реализовано делегирования вызова для метода compareTo. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 16:07 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Blazkowiczll13, Логирование реализовано правильно. Не правильно реализовано делегирования вызова для метода compareTo. Где можно посмотреть пример правильной реализации делегирования? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 16:17 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Подводя итог по данному вопросу: 1). Есть интерфейс Comparable(содержит один метод compareTo) 2). Есть класс Integer, реализующий данный интерфейс. 3). Есть прокси-класс, перехватывающий данный метод. 3). Каким образом можно правильно организовать вызов данного метода, т.е. method.invoke(...) из прокси-класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 16:43 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13, Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 16:52 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13Где можно посмотреть пример правильной реализации делегирования? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:04 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
0FDll13, Код: java 1. Зачетный трюк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:05 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13Подводя итог по данному вопросу: 1). Есть интерфейс Comparable(содержит один метод compareTo) 2). Есть класс Integer, реализующий данный интерфейс. 3). Есть прокси-класс, перехватывающий данный метод. 3). Каким образом можно правильно организовать вызов данного метода, т.е. method.invoke(...) из прокси-класса? Проблема в аргументе. Это понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:06 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
0FDll13, Код: java 1. Ошибка: Uncompilable source code - bad operand type java.lang.Object for unary operator '---' Даже если бы это сработало, проблемы это не решает. Это всего лишь пример, с помощью которого я пытаюсь понять как работает этот механизм. А если у интерфейса будет 1000 методов... то для каждого персональные условия для invoke писать ?! Более того интерфейсы которые требуется перехватывать могут определяться в процессе работы программы и неизвестны на этапе компиляции. Тогда какой смысл в прокси? Насколько я понял, динамические прокси-классы нужны для того, что бы перехватить обращение к методам заранее неизвестного интерфейса(ов), выполнить некие дополнительные действия, например логирование, как в данном примере, а затем вызвать требуемый метод объекта. Или я чего-то недопонимаю....? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:06 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13, Ну конечно, возвращается Integer. -((Integer)m.invoke).intValue() У method есть имя getName(), обрабатываете только нужные, например if(method.getName().equals("compareTo")), остальные method.invoke(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:15 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13Ошибка: Uncompilable source code - bad operand type java.lang.Object for unary operator '---' Вы слишком рано задаёте вопросы про прокси, если банально ещё ни синтаксис не освоили, ни вообще не понимаете код в примере из книги. ll13Даже если бы это сработало, проблемы это не решает. Это всего лишь пример, с помощью которого я пытаюсь понять как работает этот механизм. минус уберите и сработает. ll13А если у интерфейса будет 1000 методов... то для каждого персональные условия для invoke писать ?! Более того интерфейсы которые требуется перехватывать могут определяться в процессе работы программы и неизвестны на этапе компиляции. Ну, просто здесь такой вот особый пример. Проблема не в прокси, а в том что у вас массив прокси. И если вы создаёте массив прокси и пытаетесь сравнивать прокси с прокси, вы должны понимать последствия. Конечно, отчасти это ещё и связано с реализацией именно Java Proxy. Существуют другие способы создать прокси. У них подобной проблемы не будет. ll13Тогда какой смысл в прокси? Есть такой термин - Aspect-Oriented Programming. ll13Насколько я понял, динамические прокси-классы нужны для того, что бы перехватить обращение к методам Угу. ll13заранее неизвестного интерфейса(ов), Смешно, да. В методе Proxy.newProxyInstance() где там неизвестные интерфейсы? ll13выполнить некие дополнительные действия, например логирование, как в данном примере, а затем вызвать требуемый метод объекта. Или я чего-то недопонимаю....? Всё верно. Задумка такая. Но есть теория, а есть практика. И практика зачастую накладывает ряд ограничений. Это надо понимать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 17:16 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
Спасибо! это рабочий код, буду разбираться дальше. Blazkowicz Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. BlazkowiczСмешно, да. В методе Proxy.newProxyInstance() где там неизвестные интерфейсы? Ну например можно так: Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 18:04 |
|
||
|
Вопрос по proxy-классам.
|
|||
|---|---|---|---|
|
#18+
ll13Ну например можно так: Код: java 1. :) В общем, для логирования и подобных AOP решений, JDK Proxy никто не использует. Он подходит только для каких-то простых реализаций, чтобы сделать фасад и перехватывать вызовы к определенному интерфейсу. Более глобальные вещи реализуют через AOP библиотеки типа Aspect4j. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2016, 18:47 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=104&tid=2124344]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 358ms |

| 0 / 0 |
