Aufrufen einer statischen Methode mithilfe von Reflektion


198

Ich möchte maindie statische Methode aufrufen . Ich habe das Objekt vom Typ erhalten Class, kann jedoch keine Instanz dieser Klasse erstellen und die staticMethode auch nicht aufrufen main.

Antworten:


289
// 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");

Falls die Methode für den privaten Gebrauch getDeclaredMethod()statt ist getMethod(). Und rufen Sie setAccessible(true)das Methodenobjekt auf.


49

Aus dem Javadoc von Method.invoke ():

Wenn die zugrunde liegende Methode statisch ist, wird das angegebene obj-Argument ignoriert. Es kann null sein.

Was passiert wenn du

Klasse klass = ...;
Methode 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
Warum nicht getMethod mit dem richtigen Namen verwenden, anstatt alle Methoden zu durchlaufen?
mjaggard

11
Manchmal ist es viel einfacher, die Methode nach Namen zu schleifen und zu finden, als getMethod zu verwenden, da getMethod (oder getDeclaredMethod) erfordert, dass Sie die Parametertypen detailliert ausarbeiten. Es kommt nur darauf an, ob die Mikroeffizienz wichtig ist - die Java-Iteration ist sehr schnell. Wenn Sie die Methode nicht millionenfach in einer inneren Schleife aufrufen, ist die Iteration schnell genug
Tony Eastwood,

2
Auch in einer realistischeren Situation würden Sie die Methode wahrscheinlich nur einmal finden, selbst wenn Sie die Reflexion verwenden, um sie mehrmals aufzurufen. Ein zusätzlicher Aufwand beim Auffinden ist daher unerheblich.
RenniePet

4
Ich werde eine schlechte Zeit mit überladenen Methoden haben.
Ulysse Mizrahi

1
@UlysseMizrahi alles hängt davon ab, worauf Sie sich einstellen, aber ja, wenn Sie Bibliothekscode schreiben, kann es gefährlich sein, sich nur auf den Namen zu verlassen. Normalerweise suche ich nach einer bestimmten Annotation oder einer bestimmten Methodensignatur, z. B. "statische Methode, die einen String verwendet und eine Instanz der Klasse zurückgibt", und behaupte dann, dass nur eine solche Methode gefunden wurde.
Cobbzilla

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

Im obigen Beispiel ist 'add' eine statische Methode, die zwei Ganzzahlen als Argumente verwendet.

Das folgende Snippet wird verwendet, um die 'add'-Methode mit den Eingaben 1 und 2 aufzurufen.

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

Referenz Link .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.