Java8 新特性之四---------重複註解與註解應用拓寬
自從Java 5中引入註解以來,這個特性開始變得非常流行,並在各個框架和專案中被廣泛使用。不過,註解有一個很大的限制是:在同一個地方不能多次使用同一個註解。Java 8打破了這個限制,引入了重複註解的概念,允許在同一個地方多次使用同一個註解。
在Java 8中使用@Repeatable註解定義重複註解,實際上,這並不是語言層面的改進,而是編譯器做的一個trick,底層的技術仍然相同。可以利用下面的程式碼說明:
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例項,輸出到控制檯的內容如下所示:
filter1
filter2
Java 8拓寬了註解的應用場景。現在,註解幾乎可以使用在任何元素上:區域性變數、介面型別、超類和介面實現類,甚至可以用在函式的異常定義上。下面是一些例子:
package com.javacodegeeks.java8.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;
public class Annotations {
@Retention( RetentionPolicy.RUNTIME )
@Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
public @interface NonEmpty {
}
public static class Holder< @NonEmpty T > extends @NonEmpty Object {
public void method() throws @NonEmpty Exception {
}
}
@SuppressWarnings( "unused" )
public static void main(String[] args) {
final Holder< String > holder = new @NonEmpty Holder< String >();
@NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();
}
}
ElementType.TYPE_USER和ElementType.TYPE_PARAMETER是Java 8新增的兩個註解,用於描述註解的使用場景。Java 語言也做了對應的改變,以識別這些新增的註解。
相關推薦
Java8 新特性之四---------重複註解與註解應用拓寬
自從Java 5中引入註解以來,這個特性開始變得非常流行,並在各個框架和專案中被廣泛使用。不過,註解有一個很大的限制是:在同一個地方不能多次使用同一個註解。Java 8打破了這個限制,引入了重複註解的概念,允許在同一個地方多次使用同一個註解。 在Java 8中
樂字節-Java8新特性之Base64和重復註解與類型註解
ref sin pre easy 處理 on() append 靈活 rfc 上一篇小樂給大家說了《樂字節-Java8新特性之Date API》,接下來小樂繼續給大家說一說Java8新特性之Base64和重復註解與類型註解。 一、Base64 在Java 8中,內
JAVA8新特性之方法引用與構造器引用
一:簡介 1:什麼是方法引用? 若Lambda體中的功能,已經有方法提供了實現,可以使用方法引用。 可以將方法引用理解為Lambda表示式的另一種表現形式。 2:方法
JAVA8新特性之並行流與序列流
一:簡介 二:例項說明 1:計算0-10億的和,我們比較使用fork/join和普通for迴圈的花費時間? 效
Java8新特性之Optional
.get value api new java代碼 optional padding 正常 line 空指針異常一直是困擾Java程序員的問題,也是我們必須要考慮的。當業務代碼中充滿了if else判斷null 的時候程序變得不再優雅,在Java8中提供了Optional類
Java8新特性之forEach遍歷
clas 分享圖片 pos 分享 inf div post for AC 參考文章: https://www.cnblogs.com/billyu/p/6118008.htmlJava8新特性之forEach遍歷
Java8新特性之:行為參數化傳遞代碼
Java8 行為參數化 行為參數化:一個方法接受多個不同的行為(或戰略)作為參數,並在內部使用他們,完成不同的行為的能力。 public interface ApplePredicate { /** * 謂詞(選擇標準) * @param apple * @re
Java8新特性之:Lambda表達式
java8 Lambda 一. Lambda定義(λ): -- 匿名,它不像普通方法那樣有一個明確的名稱; -- 函數,它不像普通方法那樣屬於某個特定的類,但和方法一樣,Lambda有參數列表、函數主體、返回類型或拋出異常列表: -- 傳遞,Lambda可以作為參數傳遞給方法或存儲在
Java8新特性之:CompletableFuture
java8 CompletableFuture 一. CompletableFuture 1.Future接口 Future設計的初衷:對將來某個時刻會發生的結果進行建模。 它建模了一種異步計算,返回一個執行運算結果的引用,當運算結束後,這個引用被返回給調用方。在Fu
Java8新特性之:新的日期和時間API
java8 時間日期API 一. LocalDate、LocalTime、Instant、Duration以及Period 1.LocalDate只提供日期,不含當天時間信息LocalDate date = LocalDate.of(2018, 5, 03); int year = da
Java8新特性之:默認方法
java8 默認方法 一. 默認方法 1.默認方法的使用模式: -- 可選方法 類實現了接口,但是刻意地將一些方法留白。public interface Iterator<E> { boolean hasNext(); E next
Java8新特性之:Optional
java8 Optional 一. 用Optional取代null 1. Optional類 java.util.Optional<T>是一個封裝Optional值的類。 變量存在時,Optional類只是對類進行簡單的封裝。變量不存在時,缺失的值會被建模
java8新特性之Lambda表達式入門
java8新特性 obj 返回值 報錯 java8 虛擬 ret UNC bject 一 什麽是Lambda表達式 Lambda表達式:可以讓你的代碼更加的簡潔。ambda無法單獨出現,需要一個函數式接口來盛放,可以說lambda表達式方法體是函數式接口的實現,lambd
Java8 新特性之流式數據處理
沒有 ica all red 年齡 過濾 計算機 any spl 流中間操作 操 作 類 型 返回類型 操作參數 函數描述符 filter 中間 Stream Predicate T -> boolean map 中間 Stream Function
java8新特性之lambda
函數式 var ride urn fun 模擬實現 face 清晰 例如 一、什麽是lambda 在函數編程中,我們經常將方法作為參數來傳遞,這樣不僅結構清晰而且更容易去組織一個良好的代碼結構。例如Javascript寫法: <script type="text/j
【小家java】Java8新特性之---CompletableFuture的系統講解和例項演示(使用CompletableFuture構建非同步應用)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
基礎 | Java8新特性之Lambda表示式
Lambda表示式是Java8所引入的新特性之一,其基於函式式介面,以極大地減少程式碼冗餘,並提高程式碼的可讀性。 Lambda表示式的基本語法 參考答案: Java8中引入箭頭操作符(也叫Lambda操作符)將Lambda表示式拆分成左右兩部分: 左
Java8新特性之Stream詳解二
最近在公司的專案中常用Stream結合Lambda表示式來操作集合,使得專案整體程式碼簡潔和整齊;並且上一章也講了一些關於Stream的常用操作,比如:map()、filter()、concat()、reduce()、max()、min()、
Java8新特性之Stream詳解一
寫了Lambda表示式的部落格,怎麼能少了對Stream的學習呢!接下來就將我所理解的Stream分享給大家,歡迎指出不足之處... 一、為什麼要使用Stream?Stream是什麼?在Java中該怎麼用呢? (1)為什麼要使用Str
Java8新特性之Lambda表示式學習二
大家好,又來到超超部落格大本營啦!歡迎大家...... 上一章我們講解了Lambda表示式的基礎語法,引數列表、變數等知識點,接下來我們接續探究Lambda的表示式、以及其中的方法引用。 一、Lambda的表示式: (1)如果表示式只有一行,那麼可以直接寫(不需要{}); (2)