Programavimas

Dinamiškai naudojant statinį metodą be egzemplioriaus nuorodos (1999 m. Liepos 6 d.)

Klausimas: Kaip galiu dinamiškai pasinaudoti statiniu metodu be nuorodos į egzempliorių? Method.invoke (Object obj, Object [] parms) reikia konkretaus egzemplioriaus, bet aš noriu iškviesti statinį metodą tiesiai į Class objektą! Ar tai įmanoma „Java“?

Sprendimas yra dinamiškai sukurti egzempliorių su newInstance () ir paskambink pasikviesti su tuo egzemplioriumi, bet tai neveiks, jei klasėje nėra tuščio konstruktoriaus. Ir aš nenoriu kurti pavyzdžių, kurių man tikrai nereikia!

A: Pagal JDK API dokumentaciją, skirtą Method.invoke (Object obj, Object [] argumentuoja)"Jei pagrindinis metodas yra statinis, tada nurodytas obj argumentas ignoruojamas. Tai gali būti nulis. "Taigi, užuot perduodant faktinį objektą, gali būti perduodamas nulis; todėl statinį metodą galima naudoti be faktinio klasės egzemplioriaus.

Ši pavyzdinė programa išbando šį faktą ir teisingai sukuria žemiau pateiktą išvestį. Konkretus klasės pavyzdys Foo niekada nėra sukurta.

importuoti java.lang.reflect. *; viešosios klasės testas {public static void main (String [] args) {try {Class c = Class.forName ("Foo"); System.out.println ("Įkrauta klasė:" + c); Metodas m = c.getDeclaredMethod ("getNum", null); System.out.println ("Turiu metodą:" + m); Objektas o = m.invoke (null, null); System.out.println ("Išvestis:" + o); } gaudyti (e išimtis) {e.printStackTrace (); }}} klasė Foo {public static int getNum () {return 5; }} 

Programos išvestis:

Įkrauta klasė: klasė „Foo Got“ metodas: viešasis statinis int Foo.getNum () Rezultatas: 5 
„Random Walk Computing“ yra didžiausia „Java / CORBA“ konsultacinė parduotuvė Niujorke, orientuota į finansų įmonės sprendimus. „Random Walk“ konsultantai, žinomi dėl savo pažangiausios „Java“ patirties, skelbia ir kalba apie „Java“ kai kuriuose labiausiai gerbiamuose pasaulio forumuose.

Šią istoriją „Dinamiškai naudojant statinį metodą be egzemplioriaus nuorodos (1999 m. Liepos 6 d.)“ Iš pradžių paskelbė „JavaWorld“.

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