Скажем, у меня есть аннотацию со свойством:Передача аннотаций свойств мета-аннотаций
@Named(name = "Steve")
private Person person
, и я хочу, чтобы создать соединение аннотацию с несколькими мета-аннотаций, в том числе тот, который принимает свойство
@Named
@AnotherAnnotation
@YetAnotherAnnotation
public @interface CompoundAnnotation {
...
}
Есть ли способ передать свойства объединенной аннотации одной из мета-аннотаций?
Например, что-то вроде этого:
@CompoundAnnotation(name = "Bob")
private Person person;
, что эквивалентно, но гораздо более удобным, чем
@Named(name = "Bob")
@AnotherAnnotation
@YetAnotherAnnotation
private Person person;
Спасибо!
PS извинения за мой плохой выбор аннотации примера - у меня не было javax.inject. @ Указанная аннотация в уме, просто какая-то произвольная аннотация, которая имеет свойства.
Спасибо всем за ваши ответы/комментарии.
Это определенно похоже, что это невозможно. Тем не менее, просто случается, что для моего случая-в-точке есть простой подход, который я расскажу в случае, если это кому-то поможет:
Я работаю с Spring и хочу создать свои собственные аннотации, Компонент в виде мета-аннотации, автоматически определяемый при сканировании компонентов. Тем не менее, я также хотел установить свойство BeanName (соответствующее свойству value в @Component), чтобы у меня были пользовательские имена компонентов.
Ну, оказывается, что вдумчивые парни в Spring позволили сделать именно это: AnnotationBeanNameGenerator примет свойство «значение» любой аннотации, переданной им, и использует это как имя компонента (и, конечно, default, он будет получать только аннотации, которые являются @Component или имеют @Component в качестве мета-аннотации). В ретроспективе это должно было быть очевидным для меня с самого начала - так существующие аннотации с @Component как мета-аннотации, такие как @Service и @Registry, могут содержать имена бинов.
Надеюсь, что это кому-то полезно. Я все еще думаю, что стыдно, что это невозможно в целом, хотя!
Я не вижу, как, если вы не добавляете аннотации через обработку байтового кода во время загрузки. (Или, может быть, пользовательский обработчик аннотаций.) Любопытно посмотреть, что все возможно без трюков. –
Просто размышляя здесь, не будет ли это обходным путем, если бы у вас был базовый класс, аннотированный с помощью AnotherAnnotation и YAA, а затем расширенный класс Person? Посмотрите также на Размышления, возможно, вы получите некоторые идеи: http://code.google.com/p/reflections/ – maksimov
Связано с http://stackoverflow.com/questions/1624084/why-is-not-possible- к простираться-аннотаций-в-Java – Gray