Java 8 | 重複註解
自從Java 5
中引入註解以來,這個特性開始變得非常流行,並在各個框架和項目中被廣泛使用。不過,註解有一個很大的限制是:在同一個地方不能多次使用同一個註解。 Java 8
打破了這個限制,引入了重複註解的概念,允許在同一個地方多次使用同一個註解。
在Java 8
中使用@Repeatable
註解定義重複註解,實際上,這並不是語言層面的改進,而是編譯器做的一個trick
,底層的技術仍然相同。可以利用下面的代碼說明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package com.javacodegeeks.java8.repeatable.annotations;
import java.lang.annotation.ElementType; import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
public class RepeatingAnnotations { @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) public @interface Filters { Filter[] value(); } @Target( ElementType.TYPE ) @Retention( RetentionPolicy.RUNTIME ) @Repeatable( Filters.class ) public @interface Filter { String value(); }; @Filter( "filter1" ) @Filter( "filter2" ) public interface Filterable { } public static void main(String[] args) { for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) { System.out.println( filter.value() ); } } }
|
正如我們所見,這裡的Filter
類使用@Repeatable(Filters.class)
註解修飾,而Filters
是存放Filter
註解的容器,編譯器盡量對開發者屏蔽這些細節。這樣,Filterable
接口可以用兩個Filter
註解註釋(這裡並沒有提到任何關於Filters
的信息)。
另外,反射API
提供了一個新的方法:getAnnotationsByType()
,可以返回某個類型的重複註解,例如Filterable.class.getAnnoation(Filters.class)
將返回兩個Filter
實例,輸出到控制台的內容如下所示:
註:更詳細的內容,可以參考官方文件
註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南