2009-06-02 5 views
10

Dire, ho un riferimento a un oggetto di classe con SomeType che ha un metodo statico. C'è un modo per chiamare quel metodo senza istanziare SomeType prima? Preferibilmente non sfuggire alla tipizzazione forte.Chiamare il metodo statico su una classe?

EDIT: OK, ho rovinato.

interface Int{ 
    void someMethod(); 
} 

class ImplOne implements Int{ 
    public void someMethod() { 
     // do something 
    } 
} 

Class<? extends Int> getInt(){ 
    return ImplOne.class; 
} 

In questo caso someMethod() non può essere statico in ogni caso.

+0

Penso che questa domanda riguardi effettivamente la riflessione Java, ma in realtà non è chiara. –

+0

Hmm, immagino di no. –

risposta

24

un metodo statico, per definizione, è chiamato su una classe e non su un'istanza di quella classe.

quindi se si utilizza:

SomeClass.someStaticMethod() 

si sta istanziare nulla (lasciare da parte il carico di classe e istanza della classe SomeClass stesso, che la JVM gestisce ed è fuori dalla tua portata).

Questo si oppone ad un metodo regolare chiamato su un oggetto, che è già stato un'istanza:

SomeObject o = someObject; // had to be instantiated *somewhere* 
o.someMethod(); 
+2

Eclipse (e molto probabilmente altri IDE) offre anche un avvertimento se si sta chiamando un metodo statico usando la sintassi dell'istanza ("Accesso non statico al membro statico", si chiama). Non è un errore, ma è un po 'meno chiaro rispetto all'utilizzo di un accesso esplicitamente statico. –

+1

Penso che anche il compilatore stesso di Sun rilasci quell'avviso. Credo che sia abbastanza confuso da dover essere commesso un errore: http://stackoverflow.com/questions/610458/why-isnt-calling-a-static-method-by-way-of-an-instance-an- error-per-il-java-com – Thilo

24

Non sono sicuro di quale sia la situazione, ma se stai cercando di eseguire il metodo statico su una classe senza conoscere il tipo di classe (cioè non sai che è SomeType, hai solo l'oggetto Class), se si conosce il nome e parametri del metodo si potrebbe usare la riflessione e fare questo:

Class c = getThisClassObjectFromSomewhere(); 

//myStaticMethod takes a Double and String as an argument 
Method m = c.getMethod("myStaticMethod", Double.class, String.class); 
Object result = m.invoke(null, 1.5, "foo"); 
-1

Sì. Questo è ciò che i metodi statici sono tutti. Basta chiamarlo. SomeType.yourStaticMethodHere().

10

Dato che si parla di un oggetto di classe, presumo che si sia interessati alla riflessione di Java. Ecco un breve frammento che fa ciò che stai cercando di fare:

Class someClass = SomeType.class; 
Method staticMethod = someClass.getMethod("methodName", ...); 

// pass the first arg as null to invoke a static method 
staticMethod.invoke(null, ...);