Java Reflection-dynaamiset Välityspalvelimet

Java Reflection-sovelluksella luot dynaamisia toteutuksia rajapinnoista ajonaikana. Tällöin käytetään luokkaa java.lang.reflect.Proxy. Tämän luokan nimi on, miksi viittaan näihin dynaamisiin käyttöliittymätoteutuksiin dynaamisina välityspalvelimina. Dynaamisia välityspalvelimia voidaan käyttää moniin eri tarkoituksiin, kuten tietokantayhteyteen ja tapahtumien hallintaan, dynaamisiin valeobjekteihin yksikkötestaukseen ja muihin AOP: n kaltaisiin sieppaustarkoituksiin.

valtakirjojen luominen

dynaamiset valtakirjat luodaan Proxy.newProxyInstance() – menetelmällä. newProxyInstance() – menetelmässä tarvitaan 3 parametria:

  1. ClassLoader, joka “lataa” dynaamisen välityspalvelinluokan.
  2. joukko toteutettavia rajapintoja.
  3. An InvocationHandler välittää kaikki menetelmät vaatii valtakirjan.

tässä on esimerkki:

tämän koodin suorittamisen jälkeen proxy muuttuja sisältää MyInterface – rajapinnan dynaamisen toteutuksen. Kaikki valtakirjaan soitetut puhelut välitetään handler yleisen InvocationHandler rajapinnan toteutukseen. InvocationHandler ‘ s käsitellään seuraavassa osassa.

Invocationhandlerin

kuten aiemmin mainittiin, InvocationHandler toteutuksen on läpäistävä Proxy.newProxyInstance() – menetelmällä. Kaikki dynaamiseen välityspalvelimeen soitetut menetelmäpuhelut välitetään tähän InvocationHandler toteutukseen. Tältä näyttää InvocationHandler – rajapinta:

public interface InvocationHandler{ Object invoke(Object proxy, Method method, Object args) throws Throwable;}

tässä esimerkki toteutuksesta:

public class MyInvocationHandler implements InvocationHandler{ public Object invoke(Object proxy, Method method, Object args) throws Throwable { //do something "dynamic" }}

proxy – menetelmälle siirretty parametri invoke() on rajapinnan toteuttava dynaaminen välitysobjekti. Useimmiten et tarvitse tätä esinettä.

Method invoke() – menetelmään siirretty objekti edustaa rajapinnassa dynaamisen välityspalvelimen toteuttamaa menetelmää. Method – objektista voit saada menetelmän nimen, parametrityypit,palautustyypin jne. Lisätietoja on Menetelmätekstissä.

Object args array sisältää parametrin arvot, jotka välitetään välityspalvelimelle, kun toteutetun rajapinnan menetelmää kutsuttiin. Huom: primitiivit (int, long etc)toteutetussa käyttöliittymässä kääritään niiden objekti kollegansa (kokonaisluku, pitkä jne.).

tunnetut käyttötapaukset

dynaamisia valtakirjoja tiedetään käytettävän ainakin seuraaviin tarkoituksiin:

  • tietokantayhteys ja Tapahtumanhallinta
  • dynaamiset Valeobjektit Yksikkötestaukseen
  • DI Containerin Mukauttaminen mukautettuihin Tehdasliittymiin
  • AOP: n kaltainen menetelmä sieppaus

tietokantayhteys ja Tapahtumanhallinta

Spring frameworkissa on transaktion välityspalvelin, joka voi käynnistää ja toimittaa / palauttaa transaktion puolestasi. Miten tämä toimii on kuvattu tarkemmin tekstissä Advanced yhteys ja Transaction rajaus ja lisääminen , joten minä vain kuvata sitä lyhyesti. Kutsujärjestyksestä tulee jotain tämän suuntaista:

Dynamic Mock Objects for Unit Testing

Butterfly Testing Tools käyttää dynaamisia proxioita dynaamisten tynkien, pilkkien ja proxien toteuttamiseen yksikkötestauksessa. Kun testataan A-luokkaa, joka käyttää toista B-luokkaa (käyttöliittymä todella), voit siirtää B: n pilkkatoteutuksen A: ksi todellisen B: n sijaan. Kaikki menetelmäkäynnit B: lle on nyt tallennettu, ja voit määrittää, mitä palautusarvoja mock B on palautettava.

lisäksi Perhostestausvälineiden avulla voidaan kääriä oikea B mock B: hen, jolloin kaikki mockiin liittyvät metodikutsut tallennetaan ja välitetään sitten todelliselle B: lle.näin voidaan tarkistaa, mitä menetelmiä kutsuttiin todelliselle toimivalle B: lle. esimerkiksi, jos testaat a DAO: ta, voit kääriä tietokantayhteyden mockiin. Dao ei näe eroa, ja DAO voi lukea / kirjoittaa tietoja tietokantaan tavalliseen tapaan, koska mock välittää kaikki puhelut tietokantaan. Mutta nyt voit tarkistaa mockin kautta, käyttääkö Dao yhteyttä oikein, esimerkiksi jos connection.close() kutsutaan (tai ei kutsuta), jos olet odottanut sitä. Tätä ei yleensä ole mahdollista määrittää DAO: n tuottoarvosta.

DI-Kontin sovittaminen mukautettuihin tehtaiden rajapintoihin

riippuvuussuihkusäiliön Perhossäiliössä on voimakas ominaisuus, jonka avulla voit ruiskuttaa koko säiliön sen tuottamiin papuihin. Mutta, koska et halua riippuvuutta säiliön käyttöliittymä, säiliö pystyy mukauttamaan itsensä mukautetun tehtaan käyttöliittymä suunnittelun. Tarvitset vain käyttöliittymän. Ei toteutusta. Näin tehtaan käyttöliittymä ja luokka voisi näyttää jotain tällaista:

public interface IMyFactory { Bean bean1(); Person person(); ...}

kun MyAction – Luokka kutsuu menetelmiä IMyFactory – instanssille, jonka kontti ruiskuttaa konstruktoriinsa, menetelmäkutsut muunnetaan IContainer.instance() – menetelmään, jota käytetään instanssien saamiseksi säiliöstä. Näin esine voi käyttää Butterfly Containeria tehtaana suorituksen aikana sen sijaan, että siihen ruiskutetaan riippuvuuksia luomisen aikaan. Ja tämä ilman mitään riippuvuuksia tahansa Perhonen kontti erityisiä rajapintoja.

AOP: n kaltainen method Interception

The Spring framework mahdollistaa method calls to a certain bean, edellyttäen että bean toteuttaa jonkin rajapinnan. Jousikehys kietoo pavun dynaamiseen proffaan. Valtakirja sieppaa kaikki papuun soitetut puhelut. Välityspalvelin voi päättää kutsua muita menetelmiä muihin kohteisiin joko ennen, sen sijaan, tai sen jälkeen, kun olet siirtänyt menetelmäkutsun papuun käärittyyn.

Vastaa

Sähköpostiosoitettasi ei julkaista.