Связывание компонентов.
Контейнер Java Beans
Dynamic Proxy Class API используется в классе — перечислении BeanBindingManager. Ниже приведен его исходный код. New BeanInvocationHandler (targetGroup.getTargetObject (), targetGroup. getTargetMethod (), eventGroup. getEventMethod ())); Public Object invoke (Object proxy, Method method, Object args) throws Throwable {. Catch (IllegalAccessException — InvocationTargetException e) {. Method… Читать ещё >
Связывание компонентов. Контейнер Java Beans (реферат, курсовая, диплом, контрольная)
BeanInvocationHandler
Как было сказано ранее, для создания реализаций интерфейса слушателя был использован Java Dynamic Proxy Class API, позволяющий динамически создавать реализации интерфейсов. Сначала было необходимо создать класс, реализующий интерфейс InvocationHandler, который перехватывает и обрабатывает вызов методов реализуемого интерфейса. Ниже приведен исходный код данного класса.
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {.
Object result = null;
if (method.equals (eventMethod)) {.
result = targetMethod. invoke (target, null);
}.
return result;
}.
}.
Конструктор класса BeanInvocationHandler принимает на вход 3 параметра: объект, метод которого нужно вызвать при наступлении события, метод, который нужно вызвать, и метод интерфейса слушателя, который вызовет объект — источник при наступлении события (это необходимо, так как интерфейс слушатель может иметь несколько методов).
BeanBindingManager
Dynamic Proxy Class API используется в классе — перечислении BeanBindingManager. Ниже приведен его исходный код.
public enum BeanBindingManager {.
INSTANCE ();
private EventBindingGroup eventGroup;
public void setEventGroup (EventBindingGroup eventGroup) {.
this.eventGroup = eventGroup;
}.
public void bind (TargetBindingGroup targetGroup) {.
if (eventGroup == null) return;
Method listenerMethod = eventGroup. getAddListenerMethod ();
Object proxy = Proxy. newProxyInstance (.
getClass ().getClassLoader (),.
new Class[]{listenerMethod.getParameterTypes ()[0]},.
new BeanInvocationHandler (targetGroup.getTargetObject (), targetGroup. getTargetMethod (), eventGroup. getEventMethod ()));
try {.
listenerMethod.invoke (eventGroup.getEventSource (), proxy);
} catch (IllegalAccessException | InvocationTargetException e) {.
e.printStackTrace ();
}.
eventGroup = null;
}.
public boolean isChoosingTarget () {.
return eventGroup ≠ null;
}.
public void cancelBinding () {.
eventGroup = null;
}.
}.
Для более удобного связывания компонентов было создано два класса: EventBindingGroup, содержащий ссылку на объект — источник событий, ссылку на метод, с помощью которого можно подписаться на события, и ссылку на метод интерфейса слушателя, который будет вызван источником при наступлении события, и TargetBindingGroup, содержащий ссылку на объект, метод которого должен быть вызван при наступлении события, и ссылку на сам метод. Класс BeanBindingManager было решено реализовать, применив паттерн проектирования «Одиночка», так как требовалось, чтобы в приложении был только один глобальный объект BeanBindingManager. В таком случае отсутствует возможность совершить ошибку при связывании компонентов из-за использования неверной ссылки на объект BeanBindingManager.
Шаблон Одиночка в Java
«Шаблон одиночка гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.» [16]. Существует несколько способов реализации одиночки в java, однако, начиная с версии 1.5, в которой появились классы — перечисления, лучшим способом является использование класса — перечисления.
public enum Elvis {.
INSTANCE;
public void leaveTheBuilding () {…}.
Помимо простоты и краткости такой подход обеспечивает потокобезопасность и возможность сериализации объекта одиночки.