调用方法

使用反射调用方法与使用反射访问字段类似。下面是一个示例代码,展示了如何使用 Java 的反射 API 来调用一个方法:

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 获取类对象
        Class<?> clazz = MyClass.class;

        // 创建类实例
        Object obj = clazz.newInstance();

        // 获取方法对象
        Method method = clazz.getMethod("myMethod", String.class);

        // 调用方法
        method.invoke(obj, "Hello, Reflection!");
    }
}

class MyClass {
    public void myMethod(String message) {
        System.out.println("Method called: " + message);
    }
}

在上面的示例中,我们首先获取了要调用方法的类对象 clazz,然后使用 getMethod() 方法获取了名为 "myMethod" 的方法对象 method。接下来,我们创建了该类的实例 obj,最后使用 invoke() 方法调用了该方法,并传递了一个字符串参数。

运行上述代码,将会输出 "Method called: Hello, Reflection!"。

请注意,使用反射调用方法需要处理异常,因为可能会抛出 NoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException 等异常。在示例代码中,我们使用了 throws Exception 来简化异常处理,但在实际应用中,你可能需要根据具体情况进行适当的异常处理。

调用静态方法

要使用反射调用静态方法,与调用实例方法相比,有一些细微的差别。以下是一个示例代码,展示了如何使用 Java 的反射 API 来调用一个静态方法:

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 获取类对象
        Class<?> clazz = MyClass.class;

        // 获取方法对象
        Method method = clazz.getMethod("myStaticMethod", String.class);

        // 调用静态方法
        method.invoke(null, "Hello, Reflection!");
    }
}

class MyClass {
    public static void myStaticMethod(String message) {
        System.out.println("Static method called: " + message);
    }
}

在上面的示例中,我们首先获取了要调用方法的类对象 clazz,然后使用 getMethod() 方法获取了名为 "myStaticMethod" 的静态方法对象 method。注意,由于是静态方法,我们不需要创建类的实例。

接下来,我们使用 invoke() 方法调用了该静态方法,并传递了一个字符串参数。由于是静态方法,我们将 null 作为第一个参数传递给 invoke() 方法。

运行上述代码,将会输出 "Static method called: Hello, Reflection!"。

同样地,使用反射调用静态方法也需要处理异常,可能会抛出 NoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException 等异常。在示例代码中,我们使用了 throws Exception 来简化异常处理,但在实际应用中,你可能需要根据具体情况进行适当的异常处理。

调用非public方法

要使用反射调用非public方法,你需要使用 getDeclaredMethod() 方法来获取方法对象,而不是使用 getMethod() 方法。以下是一个示例代码,展示了如何使用 Java 的反射 API 来调用一个非public方法:

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) throws Exception {
        // 获取类对象
        Class<?> clazz = MyClass.class;

        // 获取非public方法对象
        Method method = clazz.getDeclaredMethod("myPrivateMethod");

        // 设置方法可访问
        method.setAccessible(true);

        // 创建类实例
        Object obj = clazz.newInstance();

        // 调用非public方法
        method.invoke(obj);
    }
}

class MyClass {
    private void myPrivateMethod() {
        System.out.println("Private method called");
    }
}

在上面的示例中,我们使用 getDeclaredMethod() 方法来获取名为 "myPrivateMethod" 的非public方法对象 method。由于该方法是私有的,我们还需要调用 setAccessible(true) 方法来设置方法可访问。然后,我们创建了该类的实例 obj,最后使用 invoke() 方法调用了该非public方法。

运行上述代码,将会输出 "Private method called"。

请注意,使用反射调用非public方法同样需要处理异常,可能会抛出 NoSuchMethodExceptionIllegalAccessExceptionInvocationTargetException 等异常。在示例代码中,我们使用了 throws Exception 来简化异常处理,但在实际应用中,你可能需要根据具体情况进行适当的异常处理。