Skip to content

使用反射调用方法与使用反射访问字段类似。下面是一个示例代码,展示了如何使用 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!

同样地,使用反射调用静态方法也需要处理异常,可能会抛出·NoSuchMethodException·、·IllegalAccessExceptionInvocationTargetException等异常。在示例代码中,我们使用了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来简化异常处理,但在实际应用中,你可能需要根据具体情况进行适当的异常处理。