Может ли класс Java, который реализует интерфейс, наследовать аннотации автоматически? - PullRequest
4 голосов
/ 11 августа 2011

Предположим, у меня был интерфейс с некоторыми аннотациями, например:

@SpecialClass
public interface IFoo { /* ... */ }

И предположим, я создаю класс, который реализует интерфейс:

public class Foo implements IFoo { /* ... */ }

Может ли класс Foo каким-либо образом "наследовать" или автоматически копировать все или некоторые аннотации из IFoo и его членов (например, автоматически аннотировать Foo как @SpecialClass и т. Д.)?

Это было бы удобно для реализации классов веб-служб (например, сгенерированных инструментом "wsimport" JAX-WS), просто реализуя их аннотированные интерфейсы без явной необходимости копировать аннотации интерфейса в реализующий класс (например, javax.jws.WebService javax.xml.ws.RequestWrapper и т. Д.).

1 Ответ

6 голосов
/ 11 августа 2011

РЕДАКТИРОВАТЬ: я оставляю этот ответ здесь для общей информации и будущих читателей, но Андреас указал на важный фрагмент Javadoc, который я пропустил:

Обратите внимание, что этот тип мета-аннотации не действует, если аннотированный тип используется для аннотирования чего-либо, кроме класса. Также обратите внимание, что эта метааннотация приводит только к тому, что аннотации наследуются от суперклассов; аннотации к реализованным интерфейсам не действуют.

Другими словами, не поможет в этой ситуации. Кроме того, это полезно, только если у вас есть контроль над самой аннотацией, конечно.

Я подозреваю, что реальный ответ заключается в том, что вы просто должны применять аннотацию везде. Если вы беспокоитесь о том, чтобы забыть один, вы можете написать модульный тест, который находит все ваши классы (легче сказать, чем сделано, я понимаю) и проверяет наличие аннотации для всех классов, реализующих данный интерфейс.


Вы пытались применить аннотацию Inherited к самой аннотации SpecialClass?

Указывает, что тип аннотации автоматически наследуется. Если унаследованная метааннотация присутствует в объявлении типа аннотации, и пользователь запрашивает тип аннотации в объявлении класса, и у объявления класса нет аннотации для этого типа, тогда суперкласс класса будет автоматически запрашиваться для типа аннотации. Этот процесс будет повторяться до тех пор, пока не будет найдена аннотация для этого типа или пока не будет достигнута вершина иерархии классов (Object). Если ни у одного суперкласса нет аннотации для этого типа, тогда запрос укажет, что у рассматриваемого класса такой аннотации нет.

Это, конечно, звучит точно так, как вы хотите.

...