Получает все поля с определенной аннотацией к полю или получателю - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно использовать какой-то способ, чтобы получить все поля, которые отмечены конкретной аннотацией. Аннотация может быть в поле или в получателе (суперкласса), например

public MyClass {

    @MyAnnotation
    String myName;

    int myAge;

    @MyAnnotation
    int getMyAge() { return myAge; }
}

Так что мне нужно Field[] getAllAnnotatedFields(MyClass.class, MyAnnotation.class).

Я мог бы написать этот метод самостоятельно, но мне интересно, существует ли какой-нибудь метод util. (Я не могу найти ни одного в Apache Commons, Guava или Google отражениях).

1 Ответ

0 голосов
/ 13 ноября 2018

Это мое решение с использованием Apache Commons:

public static Collection<String> getPropertyNamesListWithAnnotation(Class<?> targetClass, Class<? extends Annotation> annotationClass) {
    Set<String> fieldNamesWithAnnotation = FieldUtils.getFieldsListWithAnnotation(targetClass, annotationClass).stream().map(Field::getName).collect(Collectors.toSet());
    fieldNamesWithAnnotation.addAll(MethodUtils.getMethodsListWithAnnotation(targetClass, annotationClass, true, false).stream()
            .map(Method::getName)
            .filter(LangHelper::isValidGetterOrSetter)
            .map(name -> StringUtils.uncapitalize(RegExUtils.replaceFirst(name, "^(get|set|is)", "")))
            .collect(Collectors.toSet()));
    return fieldNamesWithAnnotation;
}

private static boolean isValidGetterOrSetter(String methodName) {
    if (!StringUtils.startsWithAny(methodName, "get", "set", "is")) {
        LOG.warn("Annotated method is no valid getter or setter: '{}' -> Ignoring", methodName);
        return false;
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...