[Java] Wann sollte der erste Parameter von getDeclaredMethod.invoke mit Null gefüllt werden?

Wann wird der erste Parameter von getDeclaredMethod.invoke mit Null gefüllt?

1. Antwort

Wenn die aufzurufende Methode eine statische Methode ist


2. Informationen zur Java-Reflexion

Bei Verwendung der Methode getDeclaredMethod.invoke() ist der erste Parameter die Objektinstanz der aufzurufenden Methode, nicht die Parameter der Methode. In den meisten Fällen müssen Sie als erstes Argument eine Objektinstanz ungleich Null angeben.

  • Wenn die aufzurufende Methode jedoch statisch ist (also nicht von einer Objektinstanz abhängt), kann der erste Parameter auf null gesetzt werden. Statische Methoden gehören zur Klasse selbst und nicht zu einer Instanz der Klasse, sodass keine spezifische Objektinstanz bereitgestellt werden muss.

Das Folgende ist ein Beispiel, das die Verwendung der Methode getDeclaredMethod.invoke() beim Aufruf statischer und nicht statischer Methoden zeigt:

import java.lang.reflect.Method;

public class ExampleClass {
    
    
    public static void staticMethod() {
    
    
        System.out.println("This is a static method");
    }

    public void nonStaticMethod() {
    
    
        System.out.println("This is a non-static method");
    }

    public static void main(String[] args) throws Exception {
    
    
        Class<?> clazz = ExampleClass.class;

        // 调用静态方法
        Method staticMethod = clazz.getDeclaredMethod("staticMethod");
        staticMethod.invoke(null); // 第一个参数为 null

        // 调用非静态方法
        ExampleClass instance = new ExampleClass();
        Method nonStaticMethod = clazz.getDeclaredMethod("nonStaticMethod");
        nonStaticMethod.invoke(instance); // 第一个参数为对象实例
    }
}

Im obigen Beispiel ist staticMethod() eine statische Methode, daher wird der erste Parameter auf null gesetzt, wenn die invoke()-Methode aufgerufen wird. NonStaticMethod() ist eine nicht statische Methode, daher muss eine Objektinstanz als erster Parameter bereitgestellt werden.


Beachten Sie, dass Sie beim Aufrufen von Methoden mithilfe von Reflektion Ausnahmen behandeln müssen, die möglicherweise ausgelöst werden, z. B. NoSuchMethodException und IllegalAccessException. Im Beispiel wird die Fehlerbehandlung vereinfacht, indem die Ausnahme in der main()-Methode mithilfe von throws Exception deklariert wird. In realen Anwendungen ist es jedoch am besten, Ausnahmen von Fall zu Fall abzufangen und zu behandeln.

おすすめ

転載: blog.csdn.net/weixin_42473228/article/details/134190347