Richiamare un metodo statico usando reflection


198

Voglio invocare il mainmetodo che è statico. Ho ottenuto l'oggetto di tipo Class, ma non sono in grado di creare un'istanza di quella classe e non sono nemmeno in grado di invocare il staticmetodo main.

Risposte:


290
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");

Nel caso in cui il metodo sia un uso privato getDeclaredMethod()anziché getMethod(). E chiama setAccessible(true)l'oggetto metodo.


49

Dal Javadoc di Method.invoke ():

Se il metodo sottostante è statico, l'argomento obj specificato viene ignorato. Potrebbe essere nullo.

Cosa succede quando tu

Classe klass = ...;
Metodo m = klass.getDeclaredMethod (methodName, paramtypes);
m.invoke (null, args)

13
String methodName= "...";
String[] args = {};

Method[] methods = clazz.getMethods();
for (Method m : methods) {
    if (methodName.equals(m.getName())) {
        // for static methods we can use null as instance of class
        m.invoke(null, new Object[] {args});
        break;
    }
}

11
Perché non usare getMethod con il nome corretto invece di scorrere tutti i metodi?
mjaggard,

11
A volte è molto più semplice eseguire il ciclo e trovare il metodo in base al nome piuttosto che usare getMethod perché getMethod (o getDeclaredMethod) richiede che si elaborino i tipi di parametro in modo molto dettagliato. Dipende solo se la microefficienza è importante: l'iterazione Java è molto rapida, quindi a meno che tu non stia chiamando il metodo milioni di volte in un ciclo interno, l'iterazione sarà abbastanza veloce
Tony Eastwood,

2
Inoltre, in una situazione più reale, probabilmente troverai il metodo solo una volta, anche se utilizzerai la riflessione per invocarlo più volte. Quindi un sovraccarico extra quando lo trova è irrilevante.
RenniePet,

4
Ma mi divertirò con metodi sovraccarichi.
Ulysse Mizrahi,

1
@UlysseMizrahi dipende tutto da cosa abbini, ma sì, se stai scrivendo il codice della libreria, può essere pericoloso fare affidamento solo sul nome. Di solito cerco un'annotazione specifica, o una particolare firma del metodo, come "metodo statico che prende una stringa e restituisce un'istanza della classe", quindi asserisco che è stato trovato solo uno di questi metodi.
cobbzilla,

0
public class Add {
    static int add(int a, int b){
        return (a+b);
    }
}

Nell'esempio sopra, 'aggiungi' è un metodo statico che accetta due numeri interi come argomenti.

Lo snippet seguente viene utilizzato per chiamare il metodo 'add' con input 1 e 2.

Class myClass = Class.forName("Add");
Method method = myClass.getDeclaredMethod("add", int.class, int.class);
Object result = method.invoke(null, 1, 2);

Link di riferimento .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.