Как заставить подкласс Java определять аннотацию?

Если класс определил аннотацию, возможно ли каким-то образом заставить его подкласс определять ту же аннотацию?

Например, у нас есть простая пара класса / подкласса, которая разделяет @Author @interface.. Что я хотел бы сделать, так это заставить каждый следующий подкласс определять одну и ту же аннотацию @Author, предотвращая появление RuntimeException где-нибудь в будущем.

TestClass.java:

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }

@Author( name = "foo" )
public abstract class TestClass
{
    public static String getInfo( Class<? extends TestClass> c )
    {
        return c.getAnnotation( Author.class ).name();
    }

    public static void main( String[] args )
    {
        System.out.println( "The test class was written by "
                        + getInfo( TestClass.class ) );
        System.out.println( "The test subclass was written by " 
                        + getInfo( TestSubClass.class ) );
    }
}

TestSubClass.java:

@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
8 836
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Однако для «модульного» -теста это очевидная задача. Если у вас есть подобные соглашения, которые вы хотели бы применять, но которые может быть трудно или невозможно проверить с помощью компилятора, "unit" -тесты - простой способ их проверить.

Другая возможность - реализовать собственное правило в статическом анализаторе. Здесь тоже есть много вариантов.

(Я поместил модуль в кавычки, так как это действительно проверка соглашений, а не конкретного модуля. Но он должен работать вместе с вашими модульными тестами).

Вы можете сделать аннотацию (например, @EnforceAuthor) с @Inherited в суперклассе и использовать аннотации компилятора (начиная с Java 1.6), чтобы наверстать упущенное во время компиляции. Затем у вас есть ссылка на подкласс и вы можете проверить, отсутствует ли другая аннотация (например, @Author)). Это позволило бы отменить компиляцию с сообщением об ошибке.

Ответ принят как подходящий

Вы можете сделать это с помощью JSR 269 во время компиляции. См .: http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api

Изменить 2020-09-20: Ссылка мертва, заархивированная версия здесь: https://web.archive.org/web/20150516080739/http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors. html

Как ты мог это сделать? Я бы хотел это увидеть.

Mingwei Samuel 02.03.2014 09:00

Линк мертв.

ceving 31.08.2020 11:25

Другие вопросы по теме