Наследование аннотаций класса - PullRequest
14 голосов
/ 24 августа 2011

Есть ли способ заставить классы наследовать аннотации от суперкласса?

, например

@ApplicationException(rollback=true)
public abstract class AbstractBeanActionException extends Exception {
    /* method body is simply calls to super() */
}

public class OrderBeanException extends AbstractBeanActionException {
    /* does this class have to be annotated as well ? */
}

Ответы [ 5 ]

19 голосов
/ 28 октября 2011

Если вы определяете свои классы аннотаций самостоятельно, вы можете использовать @ Inherited метааннотацию:

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

8 голосов
/ 24 августа 2011

Классовые аннотации не могут наследоваться подклассами.

Что вы можете сделать, это «заставить» подкласс использовать аннотацию во время компиляции:

https://community.oracle.com/docs/DOC-983563

4 голосов
/ 24 августа 2011

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

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

3 голосов
/ 24 августа 2011

Аннотации классов не могут быть унаследованы подклассами, но аннотации на непривилегированных методах и полях, не являющихся членами конструктора, наследуются вместе с методом / полем, с которым они связаны.Поэтому вы можете попробовать использовать их для достижения желаемого эффекта.

1 голос
/ 24 августа 2011

Когда класс помечен аннотацией, которая сама аннотируется с помощью java.lang.annotation.Inherited, вы можете запросить аннотации к классу, а унаследованные должны появиться в результатах.

ApplicationException не помечено как унаследованное. Ах, хорошо.

...