Как проверить, что аннотация используется только в определенных классах? - PullRequest
0 голосов
/ 27 июня 2018

Скажите, у меня есть аннотация @Annotate и класс A. Как я могу проверить, используется ли @Annotate в классе A и только в его подклассах (возможно, во время компиляции)?

Итак, если у нас есть:

/* Example 1 */

public class A {

}  

public class B extends A {

}

public class C {

}

Как проверить, что класс A и класс B могут быть аннотированы @Annotate, но класс C недопустим (и может вызвать ошибку компиляции).


Если мы примем решение, что это будет проверено во время компиляции:

/* Example 2 */

public class A {

}  

@Annotate
public class B extends A {

}

Пример 2 не вызовет ошибку времени компиляции, поскольку @Annotate используется для подкласса A. Пример 3 , однако, вызовет ошибку компиляции, поскольку @Annotate не используется в подклассе A.

/* Example 3 */

@Annotate
public class C {

}

Однако в любом случае это не нужно проверять во время компиляции. Я просто лично подумал, что это имеет смысл сделать.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете использовать мой checker-framework.

Просто добавьте аннотацию @CheckType к аннотации

@Target(TYPE)
@CheckType(value = A.class, type = Type.EXTEND_ALL)
public @interface OnlyOnA {
}

Теперь он может проверить, аннотирован ли он на А или его подклассе.

Это вызовет ошибку компиляции

  • снимок затмения

enter image description here

  • снимок maven

enter image description here

0 голосов
/ 27 июня 2018

Вы должны написать процессор аннотаций . Процессор аннотаций может генерировать новые файлы Java и, что более актуально для вашего случая, выдавать предупреждения во время компиляции.

Вы вызовете его во время компиляции, запустив java-компилятор следующим образом: javac -processor MyProcessor MyFile.java. Если обычный javac или ваш процессор аннотаций выдают какие-либо предупреждения, компиляция завершается неудачей.

Логика вашего процессора аннотаций специфична для вашей аннотации @Annotate и проста: разрешите аннотацию только для классов, которые подкласс A. В Интернете существуют различные учебные пособия о том, как написать процессор аннотации, в дополнение к документации Oracle, на которую я ссылался выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...