Ohjelmointi

Staattisen menetelmän dynaaminen käyttö ilman instanssiviittausta (6. heinäkuuta 1999)

K: Kuinka voin käyttää staattista menetelmää dynaamisesti ilman instanssiviitettä? Method.invoke (Object obj, Object [] -parms) tarvitsee konkreettisen esiintymän, mutta haluan kutsua staattisen menetelmän suoraan Class-objektiin! Onko tämä mahdollista Java-tilassa?

Ratkaisu on luoda ilmentymä dynaamisesti newInstance () ja soita vedota kyseisen ilmentymän kanssa, mutta tämä ei toimi, jos luokassa ei ole tyhjää konstruktoria. Enkä halua luoda instansseja, joita en todellakaan tarvitse!

A: JDK: n API-dokumentaation mukaan Method.invoke (Object obj, Object [] argumentit)"Jos taustalla oleva menetelmä on staattinen, niin määritetty obj väite ohitetaan. Se voi olla nolla. "Joten todellisen objektin välittämisen sijasta voidaan antaa nolla, joten staattinen menetelmä voidaan käyttää ilman luokan varsinaista esiintymää.

Seuraava esimerkkiohjelma testaa tämän tosiasian ja tuottaa alla olevan tuloksen oikein. Konkreettinen luokan esiintymä Foo ei koskaan luoda.

tuo java.lang.reflect. *; julkisen luokan testi {public static void main (String [] args) {try {Luokka c = Luokka.nimi ("Foo"); System.out.println ("Ladattu luokka:" + c); Menetelmä m = c.getDeclaredMethod ("getNum", null); System.out.println ("Menetelmä:" + m); Objekti o = m.invoke (null, null); System.out.println ("Tulos:" + o); } catch (Poikkeus e) {e.printStackTrace (); }}} luokka Foo {public static int getNum () {return 5; }} 

Ohjelman ulostulo:

Ladattu luokka: luokka Foo Got -menetelmä: public static int Foo.getNum () Output: 5 
Random Walk Computing on New Yorkin suurin Java / CORBA-konsultointiputiikki, joka keskittyy rahoitusyrityksen ratkaisuihin. Random Walk -konsultit, jotka tunnetaan huipputeknisestä Java-asiantuntemuksestaan, julkaisevat Java: ta ja puhuvat siitä joissakin maailman arvostetuimmista foorumeista.

Tämän tarinan "Staattisen menetelmän dynaamisesti kutsuminen ilman instanssiviittausta (6.7.1999)" julkaisi alun perin JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found