Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
ΠΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ 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 () {…}.
ΠΠΎΠΌΠΈΠΌΠΎ ΠΏΡΠΎΡΡΠΎΡΡ ΠΈ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΠΈ.