Programmering

Dynamisk påberåbning af en statisk metode uden instansreference (6. juli 1999)

Spørgsmål: Hvordan kan jeg påberåbe mig en statisk metode dynamisk uden en instansreference? Method.invoke (Object obj, Object [] parms) har brug for en konkret instans, men jeg vil kalde den statiske metode direkte på et Class-objekt! Er dette muligt i Java?

Løsningen er at oprette en instans dynamisk med newInstance () og ring påberåbe sig med den instans, men dette fungerer ikke, hvis klassen ikke har en tom konstruktør. Og jeg vil ikke oprette forekomster, som jeg virkelig ikke har brug for!

EN: I henhold til JDK API-dokumentationen til Method.invoke (Objekt obj, Objekt [] args), "Hvis den underliggende metode er statisk, så angives det obj argument ignoreres. Det kan være null. "Så i stedet for at videregive et faktisk objekt, kan et nul sendes. Derfor kan en statisk metode påberåbes uden en egentlig forekomst af klassen.

Følgende eksempelprogram tester denne kendsgerning og producerer korrekt output nedenfor. En konkret forekomst af klasse Foo er aldrig skabt.

import java.lang.reflect. *; public class Test {public static void main (String [] args) {try {Class c = Class.forName ("Foo"); System.out.println ("Indlæst klasse:" + c); Metode m = c.getDeclaredMethod ("getNum", null); System.out.println ("Fik metode:" + m); Objekt o = m.invoke (null, null); System.out.println ("Output:" + o); } fange (Undtagelse e) {e.printStackTrace (); }}} klasse Foo {public static int getNum () {return 5; }} 

Programoutput:

Indlæst klasse: klasse Foo Got metode: offentlig statisk int Foo.getNum () Output: 5 
Random Walk Computing er den største Java / CORBA konsulentbutik i New York med fokus på løsninger til den finansielle virksomhed. Random Walk-konsulenter er kendt for deres førende Java-ekspertise og offentliggør og taler om Java i nogle af de mest respekterede fora i verden.

Denne historie, "Dynamisk påberåbning af en statisk metode uden instansreference (6. juli 1999)" blev oprindeligt udgivet af JavaWorld.

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