Like Share Discussion Bookmark Smile

J.J. Huang   2020-04-05   Java   瀏覽次數:

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實例,輸出到控制台的內容如下所示:

1
2
filter1
filter2

註:更詳細的內容,可以參考官方文件


註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南