Какой-нибудь пример использования @Target ({}) для java.lang.annotation.Target? - PullRequest
1 голос
/ 10 декабря 2010

http://download.oracle.com/javase/6/docs/api/java/lang/annotation/Target.html

Эта метааннотация указывает, что объявленный тип предназначен исключительно для использования в качестве типа элемента в объявлениях сложного типа аннотации.Он не может использоваться для непосредственного аннотирования:

@Target({}) 
public @interface MemberType {
    ...
}

Что это значит?Любой пример кода, использующего это?

Примечание: я имею в виду использование @Target с пустыми аргументами, как описано в JavaDoc, а не хорошо документированное использование Target с константами enum.

Ответы [ 2 ]

4 голосов
/ 10 декабря 2010

Пустая цель используется, когда аннотация может использоваться только в других аннотациях (с непустыми наборами целей), и не может быть прикреплена к чему-либо напрямую.Примером использования этого является JAXB, где аннотация @XmlNs имеет пустой список целей;приведенный ниже код извлечен из моего собственного кода (с некоторыми очень незначительными изменениями) и представляет собой полный файл package-info.java для этого конкретного пакета:

@XmlSchema(namespace = Namespaces.MAIN,
    xmlns = { @XmlNs(prefix = "xlink", namespaceURI = Namespaces.XLINK) },
    elementFormDefault = QUALIFIED, attributeFormDefault = QUALIFIED)
package example.bindings;

import static javax.xml.bind.annotation.XmlNsForm.QUALIFIED;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;
import example.common.Namespaces;

Аннотация @XmlNs используется для указания JAXB, какой префиксиспользовать для пространства имен XLink, но эту информацию можно размещать только на уровне схемы (ограничение по общему XML, но не является проблемой по большей части), и поскольку таких отображений может быть много, их нельзя присоединитьнепосредственно к пакету, но вместо этого должен входить в свойство со значением массива основной @XmlSchema аннотации.

3 голосов
/ 10 декабря 2010

Аннотация @Target - это специальная аннотация для объявления аннотаций.Это Java-buildin с самоопределенным объявлением (@Target имеет объявление @Target(ElementType.ANNOTATION_TYPE)).Таким образом, вы не можете использовать его для класса или метода, только для аннотаций.«Нормальным» аннотациям нужно это, чтобы определить, где их можно использовать.

После простой аннотации Spring @Required, используемой для установщиков бинов требуемых свойств бина:

@Target(ElementType.METHOD)
public @interface Required {

}

Аннотация @Required может использоваться только для методов, но не для полей, классов или других элементов.

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