如何将Class.forName().getMethods()获取的方法存入Map<String, Supplier<String>>
错误原因
Method call expected 报错是因为你代码中的methodz是java.lang.reflect.Method类型的反射对象,不是可直接调用的方法名,无法直接通过methodz()的形式执行。
解决方案
你需要通过反射的invoke方法执行目标方法,同时处理反射调用的异常,还要注意如果是实例方法需要先实例化目标类,示例修改代码如下:
// 如果目标类是实例方法,先实例化对象(静态方法可跳过这步,invoke时传null) Object targetInstance = clazz.getDeclaredConstructor().newInstance(); for (Method methodz : clazz.getMethods()) { if (methodz.isAnnotationPresent(GetMapping.class)) { // 从注解中获取接口路径,不要写死,避免key重复覆盖 GetMapping getMapping = methodz.getAnnotation(GetMapping.class); String mappingKey = "GET " + getMapping.value()[0]; requestMappings.put(mappingKey, () -> { try { // 反射调用方法,无参方法第二个参数留空即可 return (String) methodz.invoke(targetInstance); } catch (Exception e) { // 按业务需求处理调用异常,此处示例抛出运行时异常 throw new RuntimeException("接口方法调用失败", e); } }); } }
注意事项
- 若调用的是静态方法,
invoke的第一个参数直接传null即可,不需要实例化目标类 - 需确保被
@GetMapping标注的方法返回值为String,否则强转时会抛出类型转换异常 - 若所有遍历的方法都属于同一个类,实例化代码提到循环外部即可,无需循环内重复实例化
内容的提问来源于stack exchange,提问作者Jason Rich Darmawan
相关产品推荐
相关产品推荐

