Аннотация с ограничением доступа только для публики c - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу убедиться, что эта аннотация может быть размещена только на публикуемых c элементах, либо поле, либо метод. Это возможно? Мои краткие исследования по этой теме c сказали нет.

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CsvAttribute {
     String columnName();
     int position();
}

Моя цель - добиться этого без блока try-catch. Так как у меня есть доступ к объекту, могу ли я сделать это без отражения?

protected Map<Integer, String> convertFieldsToMap(){
    final Method[] m = this.getClass().getDeclaredMethods();
    return new ArrayList<>(Arrays.asList(m)).stream()
            .filter(p -> p.isAnnotationPresent(CsvAttribute.class))
            .collect(Collectors.toMap(
                    p -> p.getAnnotation(CsvAttribute.class).position(),
                    p -> this.invokeGetter(p)));
}

private String invokeGetter(Method m){
    try {
        return Objects.toString(m.invoke(this), "");
    } catch (IllegalAccessException | InvocationTargetException e) {
        LOG.error("@CsvAttribute annotation must be placed on public getters!");
        e.printStackTrace();
    }
    return StringUtils.EMPTY;
}

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Невозможно настроить это в самой аннотации, но вы можете сделать это в своем процессоре аннотаций времени компиляции, если он у вас есть. Просто сгенерируйте исключение, если аннотированный элемент недействителен.

Если вы обрабатываете аннотацию только во время выполнения, это не сильно поможет. Вы можете вызвать исключение времени выполнения, но без ошибки компиляции.

1 голос
/ 27 апреля 2020

Нет, насколько мне известно, вы не можете сделать это, не задумываясь, учитывая, что вам нужно сделать аннотацию обработки. Вы можете использовать модификатор # isPubli c, чтобы определить, является ли поле или метод опубликованным c. Вам также следует использовать ElementType.METHOD, если вы хотите поддерживать методы, как указано.

На несвязанной ноте, не стесняйтесь проверить ClassGraph или Reflections для некоторых apis отражения, которые могут сделать вашу жизнь проще.

// if a method or field
if (!Modifier.isPublic(method)) {
    throw new IllegalStateException("Modifier must be public.");
}
// if a field
if (!Modifier.isPublic(field)) {
    throw new IllegalStateException("Modifier must be public.");

}
@Target({ ElementType.FIELD, ElementType.METHOD })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...