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.

Steven
quelle

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.

Adeel Ansari
quelle
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)
atk
quelle
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;
    }
}
Frostman
quelle
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 .

Hari Krishna
quelle