Java 8 註解新特性

Java註解是在版本5.0發佈的,如今Java版本已經迭代到了13.0。我剛學習Java的時候,8.0剛剛在國內興起。兩三年過去了,Java 8.0成了大部分公司主要使用的版本。那麼,今天我們來介紹Java8.0註解的一些新特性。

  • 如果使用8.0之前的版本對自定義註解實現重複註解的特性,我們必須從新定義一個註解,再把需要重複使用的註解定義爲數組類型的成員變量。我們來演示8.0版本之前的使用方式。

  • 自定義註解:

import java.lang.annotation.*;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
    String [] values();
    int number();
}
  • 自定義註解,並聲明一個以第一個註解爲類型的數組成員變量:
public @interface RepeatableAnnotation {
    MyAnnotation [] value();
}
  • 測試用例:
@RepeatableAnnotation({
        @MyAnnotation(values = {"value1", "value2"}, number = 10),
        @MyAnnotation(values = {"value1", "value2"}, number = 10)
})
public class Person {
}
  • 在Java 8.0,JDK爲我們提供了@Repeatable註解來使單獨使用註解成可能。

  • 使用@Repeatable元註解,註解到MyAnnotation上,value爲我們自定義的第二個註解的運行時類(Class類對象):

@Repeatable(RepeatableAnnotation.class)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation {
    String [] values();
    int number();
}

這裏也表明了註解也是類。

  • 使我們自定義的第二個註解與第一個註解在保留策略、作用對象和可繼承性上保持一致:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface RepeatableAnnotation {
    MyAnnotation [] value();
}
  • 測試用例:
@MyAnnotation(values = {"value1", "value2"}, number = 10)
@MyAnnotation(values = {"value1", "value2"}, number = 10)
public class Person {
}
  • 除了@Repeatable註解,Java 8.0還添加了兩個註解作用對象:
	/**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
  1. TYPE_PARAMETER表示可以作用於參數聲明。我們可以爲@Target註解添加這個值再去,在泛型前使用該註解:
public class Person <@MyAnnotation(values = {"value1", "value2"}, number = 10) T>{
}
  1. TYPE_USE表示可以作用於類型。如果爲@Target設置了該值,我們可以把註解使用到一些類型上。
	public void show(@MyAnnotation(values = {"value1", "value2"}, number = 10) String info)throws @MyAnnotation(values = {"value1", "value2"}, number = 10) Exception{
        List<@MyAnnotation(values = {"value1", "value2"}, number = 10)String> list = new ArrayList<>();
        int number = (@MyAnnotation(values = {"value1", "value2"}, number = 10) int) 10.0;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章