java - 无法使用反射 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);
}
}
这是我的目录树。
解决方案
如果您使用 getMethods 而不是 getDeclaredMethods 它应该可以工作。因为 getDeclaredMethods 只返回不在超类或超接口中的类的新方法。
而且由于您的方法是@Override-ing,如果您尝试调试,您会注意到它甚至没有循环通过该方法
推荐阅读
- java - bash:javac:找不到命令[Sublime Text 3]
- python - 为什么 jupyter notebook 在 Anaconda Prompt 中不起作用?
- javascript - 同时在循环中运行函数
- tsql - 从字符串转换日期和/或时间时,SQLCMD 给出转换失败
- algorithm - Scheme - 生成列表的所有不同排列
- django - 从 DjangoTemplateLanguage 到 re_path() 的多个参数
- python - 发送请求一个 javascript 生成的 cookie
- javascript - 如何处理 JSON?
- java - 当我执行我的程序时,程序显示 java.util.NoSuchElementException: No line found
- javascript - 如何使用对象数组的 React-hooks 设置状态()