首页 > 解决方案 > 无法使用反射 Java 获得注释

问题描述

我试图将注释添加到方法并检索其中的数据,但是当我调试代码时,我无法获得任何注释。

这可能是 DatabaseSeederImpl,一个简单的类,它调用不同的服务将数据播种到数据库中。

@Override
    public void seed() {
        seedData(SeedUserDto.class, userService);
        seedData(SeedCategoryDto.class, categoryService);
        seedData(SeedProductDto.class, productService);
    }

    private <S> void seedData(Class<?> dtoType, S service) {
        Arrays.stream(service.getClass().getDeclaredMethods())
                .filter(method -> method.isAnnotationPresent(Seed.class))
                .forEach(method -> {
                    try {
                        String fileName = method.getDeclaredAnnotation(Seed.class).fileName();
                        method.invoke(service, gson.fromJson(readJson(fileName), dtoType.arrayType()));
                    } catch (IllegalAccessException | InvocationTargetException | IOException e) {
                        e.printStackTrace();
                    }
                });
    }

这是我的注解,它针对方法,并且它的保留策略设置为运行时。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Seed {
    String fileName();
}

在我的服务中,我将此注释设置为适当的值。

@Override
@Transactional
@Seed(fileName = "categories.json")
public void seedCategories(SeedCategoryDto[] categoryDtos) {
    if (categoryRepository.count() == 0) {
        List<Category> categories = Arrays.stream(categoryDtos)
                .filter(dataValidator::isValid)
                .map(dto -> modelMapper.map(dto, Category.class))
                .collect(Collectors.toList());

        categoryRepository.saveAll(categories);
    }
}

这是我的目录树。

目录树

标签: javareflectionspring-data

解决方案


如果您使用 getMethods 而不是 getDeclaredMethods 它应该可以工作。因为 getDeclaredMethods 只返回不在超类或超接口中的类的新方法。

而且由于您的方法是@Override-ing,如果您尝试调试,您​​会注意到它甚至没有循环通过该方法


推荐阅读