Java 批注的允許的屬性類型刻意非常嚴格,但是允許的類型也可以使用一些簡潔的復合批注類型。
考慮教程站點中的示例注釋:
package annotation;
@interface ClassPreamble {String author();String[] reviewers();
}
在這里,作者和審閱者具有String和array類型,這與允許的批注屬性類型保持一致。 以下是允許的類型的完整列表(從Java 7開始):
- 串
- 類
- 任何對Class的參數化調用
- 枚舉類型
- 注釋類型,請注意不允許循環,帶注釋的類型不能引用自身
- 一個數組類型,其元素類型為上述類型之一。
現在,要使功能更豐富的ClassPreable,請考慮以這種方式定義的另外兩種注釋類型:
package annotation;public @interface Author {String first() default '';String last() default '';
}package annotation;public @interface Reviewer {String first() default '';String last() default '';
}
有了這些,ClassPreamble可以由更豐富的Author和Reviewer批注類型組成,方法是:
package annotation;
@interface ClassPreamble {Author author();Reviewer[] reviewers();
}
現在,應用于類的注釋如下所示:
package annotation;@ClassPreamble(author = @Author(first = 'John', last = 'Doe'), reviewers = {@Reviewer(first = 'first1', last = 'last1'), @Reviewer(last = 'last2') }
)
public class MyClass {
....
}
這是一個人為設計的示例,僅用于演示注釋的組成,但是該方法廣泛用于現實世界中的注釋,例如,用于定義兩個JPA實體之間的多對多關系:
@ManyToMany@JoinTable(name='Employee_Project',joinColumns=@JoinColumn(name='Employee_ID'),inverseJoinColumns=@JoinColumn(name='Project_ID'))private Collection<Project> projects;
參考:在all和其他博客上撰寫我們JCG合作伙伴 Biju Kunjummen的Java注釋 。
翻譯自: https://www.javacodegeeks.com/2012/12/composing-java-annotations.html