Spørsmål: Hvordan kan jeg påkalle en statisk metode dynamisk uten en forekomstreferanse? Method.invoke (Object obj, Object [] parms) trenger en konkret forekomst, men jeg vil kalle den statiske metoden direkte på et Class-objekt! Er dette mulig i Java?
Løsningen er å lage en forekomst dynamisk med newInstance ()
og ring påkalle
med den forekomsten, men dette vil ikke fungere hvis klassen ikke har en tom konstruktør. Og jeg vil ikke lage forekomster jeg virkelig ikke trenger!
EN: I følge JDK API-dokumentasjonen for Method.invoke (Object obj, Object [] args)
, "Hvis den underliggende metoden er statisk, er den angitte obj
argument ignoreres. Det kan være null. "Så, i stedet for å sende inn et faktisk objekt, kan en null sendes. Derfor kan en statisk metode påberopes uten en faktisk forekomst av klassen.
Følgende eksempelprogram tester dette faktum og produserer korrekt utdataene nedenfor. En konkret forekomst av klasse Foo
blir aldri skapt.
importer java.lang.reflect. *; public class Test {public static void main (String [] args) {try {Class c = Class.forName ("Foo"); System.out.println ("Lastet klasse:" + c); Metode m = c.getDeclaredMethod ("getNum", null); System.out.println ("Fikk metode:" + m); Objekt o = m.invoke (null, null); System.out.println ("Output:" + o); } fange (Unntak e) {e.printStackTrace (); }}} klasse Foo {offentlig statisk int getNum () {retur 5; }}
Programutgang:
Lastet klasse: klasse Foo Got-metode: offentlig statisk int Foo.getNum () Utgang: 5Random Walk Computing er den største Java / CORBA-konsulentbutikken i New York, med fokus på løsninger for finansforetaket. Random Walk-konsulenter er kjent for sin ledende Java-ekspertise, og publiserer og snakker om Java i noen av de mest respekterte forumene i verden.
Denne historien, "Dynamically invoking a static method without instance reference (6. juli 1999)" ble opprinnelig utgitt av JavaWorld.