MST

星途 面试题库

面试题:Java泛型方法:通配符与反射结合应用

编写一个Java泛型方法,使用通配符和反射机制来实现。该方法接受一个类对象(Class<T>)和一个包含该类对象实例的列表(List<? extends T>),然后通过反射调用列表中每个对象的指定方法(假设这个方法没有参数且返回值类型为void)。请详细实现这个泛型方法,并在主方法中通过自定义类进行调用测试。
11.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

public class GenericReflectionExample {

    // 泛型方法,使用通配符和反射机制
    public static <T> void callMethod(Class<T> clazz, List<? extends T> list, String methodName) {
        try {
            // 获取指定方法
            Method method = clazz.getMethod(methodName);
            for (T obj : list) {
                // 通过反射调用方法
                method.invoke(obj);
            }
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }

    // 自定义类
    public static class MyClass {
        public void printMessage() {
            System.out.println("Hello from MyClass!");
        }
    }

    public static void main(String[] args) {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass();
        java.util.List<MyClass> list = java.util.Arrays.asList(obj1, obj2);

        callMethod(MyClass.class, list, "printMessage");
    }
}

上述代码包含以下几个部分:

  1. 泛型方法 callMethod
    • 该方法接受一个类对象 Class<T>,一个包含该类对象实例的列表 List<? extends T> 以及要调用的方法名 methodName
    • 使用 clazz.getMethod(methodName) 获取指定方法。
    • 遍历列表,通过 method.invoke(obj) 反射调用列表中每个对象的指定方法。
  2. 自定义类 MyClass
    • 包含一个无参数且返回值为 void 的方法 printMessage
  3. 主方法 main
    • 创建 MyClass 的实例并放入列表中。
    • 调用 callMethod 方法,传入 MyClass.class、列表和方法名 "printMessage" 进行测试。