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
- TYPE_PARAMETER表示可以作用於參數聲明。我們可以爲@Target註解添加這個值再去,在泛型前使用該註解:
public class Person <@MyAnnotation(values = {"value1", "value2"}, number = 10) T>{
}
- 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;
}