1. 程式人生 > >Java8 新特性之四---------重複註解與註解應用拓寬

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)