Динамический прокси для конкретных классов

Я хочу определить перехватчик метода в программе Java, другими словами, я хочу иметь поведение, которое выполняется при каждом вызове метода. Это приложение не выполняется на сервере приложений, и поэтому я не могу использовать EJB для обхода перехватчиков вызовов. Я нашел хороший прокси API в стандартных библиотеках Java, но он ограничен, потому что ему нужен интерфейс для создания прокси:

 Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                      new Class[] { Foo.class },
                                      handler);

Есть ли аналогичный API, который не заставляет Foo.class объявляться интерфейсом?


person eliocs    schedule 24.10.2011    source источник


Ответы (4)


Почему бы не использовать CGLIB? Дополнительные сведения см. в этой статье.

Что делать, если вы хотите проксировать устаревшие классы, у которых нет интерфейсов? Вы можете использовать CGLIB. CGLIB — это мощная высокопроизводительная библиотека для генерации кода. Под прикрытием он использует ASM, небольшой, но быстрый фреймворк для манипулирования байт-кодом, для преобразования существующего байт-кода в создание новых классов. CGLIB работает быстрее, чем динамический прокси-сервер JDK. По сути, он динамически генерирует подкласс для переопределения нефинальных методов прокси-класса и связывает перехватчики, которые вызывают обратные вызовы к определяемым пользователем перехватчикам.

person Brian Agnew    schedule 24.10.2011
comment
Я новичок в CGLIB. Насколько я понимаю, он генерирует двоичный класс в памяти, но существующий загрузчик классов просто загружает класс из файловой системы, так как же он использует свой собственный загрузчик классов? - person Chao; 02.08.2016
comment
ссылка вниз, а примера нет... - person cdalxndr; 19.02.2021

К сожалению, такого API для классов нет. Многие фреймворки используют для этого библиотеки генерации байт-кода, такие как CGLIB.

person Tomasz Nurkiewicz    schedule 24.10.2011

Вы можете попробовать один из насмешливых классов. Самый простой подход может заключаться в подклассе вашего класса. Или вы можете использовать АОП для ввода нужного кода ведения журнала.

person Peter Lawrey    schedule 24.10.2011

sun.misc.ProxyGenerator может использоваться для создания прокси-классов и не проверяет, являются ли их «интерфейсы» интерфейсами. Его метод generateClassFile дает вам байт-код в виде массива байтов, который вы можете сохранить, чтобы связать с будущими сборками или изменить с помощью сторонних инструментов.

Обратите внимание, что если какой-либо из «интерфейсов» имеет метод final, вы получите сообщение об ошибке при попытке загрузить класс.

person Chris Hennick    schedule 15.05.2016
comment
sun.misc.ProxyGenerator недоступен в более новых версиях Java - person cdalxndr; 18.04.2021