使用java反射机制获取

在利用Java反射机制获取类的方法时提示报错“Unhandled exception: java.lang.NoSuchMethodException”,类的方法是使用@data生成的。和@data注解有关吗??

private void checkKsxx(KsyKsglExportDTO dto, int fori) {
        Field[] fields = dto.getClass().getDeclaredFields();
        for (Field field : fields){
            if (field.isAnnotationPresent(Excel.class)){
                Excel annotation = field.getAnnotation(Excel.class);
                String value = annotation.name();
                String name = field.getName();
                name = name.substring(0,1).toUpperCase()+name.substring(1);
                Object invoke = dto.getClass().getMethod("get" + name).invoke(dto);
            }
        }
    }


img

那肯定就是没有这个方法名的了
你直接去找编译文件夹找到这个类对应的编译后的文件,看看到底有没有这个方法,确定下自动生成类的方法命名规则

如果是因为使用了 @Data 注解,这个问题并不会产生。在使用反射获取方法时,一个常见的问题是方法名称写错了。示例代码中使用了 "get" + name 作为方法名,请确保 get + 字段名称 对应的方法已经被正确声明。如果正确的话,请检查方法的访问权限,确保其不是私有的。

@Data lombok在编译成字节码文件时肯定get和set方法的,他这个地方应该是提示让你去捕获处理NoSuchMethodException这个异常,try catch或者直接抛出都行。这里和@Data没有关系

题主这个问题很经典,你说是使用@Data 等注解来进行反射的,首先你要意识到,你这个注解的实例化时机跟你获取该实例的反射方法时机是否是先后顺序。
如果反射先于注解注入,那你是获取不到的。
你看看类似的注解@Autowire ,如果你有这个一个类,看代码

@Component
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    public UserServiceImpl() {
    }
}

我使用到了SpringBoot的注解@Component 来包扫描发现,接着通过依赖注入@Autowire 的实例,它的原理执行时机是这样的。
JDK的执行过程

img


而加上@Autowire它们之间的顺序是这样的。

img

同理,很多框架的注解如果用到了反射,那么反射用到的方法可能会在注入前使用。
那么题主坚持这么做,那还是有解决方法,那就使用@PostConstruct注解来自己依赖注入,这样发射会晚于他调用。

那么代码改造以下

@Component
public class UserServiceImpl implements UserService {

    private static UserServiceImpl basicService;

    @Autowired
    private UserMapper userMapper;

    @PostConstruct
    public void init() {
        basicService = this;
    }

    public UserServiceImpl() {
    }
}

调用使用就要通过成员 basicService来间接调用了,前面讲了,注解@Autowire 晚于反射。

希望对题主有帮助吧,我也没对症下药,我觉得题主要的是一种思维,所以就不单纯给答案了。

我也不是一上来就来求采纳的,希望我学的东能帮助到其他人。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^