Динамический прокси для конкретных классов - PullRequest
16 голосов
/ 24 октября 2011

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

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

Существует ли подобный API, который не вызываетFoo.class будет объявлен как интерфейс?

Ответы [ 4 ]

7 голосов
/ 24 октября 2011

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

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

1 голос
/ 24 октября 2011

Вы можете попробовать один из насмешливых классов. Самым простым подходом может быть подкласс, ваш класс. Или вы можете использовать AOP, чтобы ввести нужный код регистрации.

1 голос
/ 24 октября 2011

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

0 голосов
/ 15 мая 2016

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

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

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