類型注解與重複注解都是在自定義注解的基礎上,建議先了解下自定義注解,請戳:自定義注解及元注解介紹
類型注解
java8中為ElementType新增了兩個枚舉值:TYPE_PARAMETER和TYPE_USE。對應的含義:
TYPE_PARAMETER
表示該注解能使用在自定義類型參數(參數的自定義類型可以是javaBean或者枚舉等)的聲明語句中。例子如下:
先聲明個使用TYPE_PARAMETER參數的自定義注解@myAnno
@Target({ElementType.TYPE_PARAMETER})
@interface myAnno{}
定義一個方法使用自定義類型MyClass
public String getMyClassInfo(MyClass cls){
return null;
}
下面語句則是在自定義類型MyClass的聲明使用了@myAnno注解
class MyClass<@myAnno String>{}
TYPE_USE
表示該注解能使用在使用類型的任意語句中。
先定義一個自定義注解:
@Target({ElementType.TYPE_USE})
@interface myAnnoUse{}
下面示範四種情形:
- 建立執行個體時使用
MyClass<String> aClass = new @myAnnoUse MyClass<>();
- 類型強轉時使用
Object o = "test";
String str = (@myAnnoUse String) o;
- 方法形參中使用
public String getUser(@myAnnoUse String name, Integer age){
return null;
}
- 泛型中使用
public String getClasses(List<@myAnnoUse User> list){
return null;
}
重複注解
即可以在同一方法、屬性、類等類型中多次使用同一個注解。此特性相當于對JAVA8之前的重複注解在編譯層面的增強,JAVA8實作此特性主要依賴于@Repeatable注解。
JAVA8之前的寫法
定義一個重複注解:
@interface MyRepAnno{
String value();
}
@interface MyRepAnnos{
MyRepAnno[] value();
}
使用此注解:
@MyRepAnnos({@MyRepAnno(""),@MyRepAnno("")})
class TestMyClass{}
JAVA8中的寫法
定義一個重複注解:
@Repeatable(MyRepAnnos.class)
@interface MyRepAnno{
String value();
}
@interface MyRepAnnos{
MyRepAnno[] value();
}
使用此注解:
@MyRepAnno("")
@MyRepAnno("")
class TestMyClass{}
上面例子中發現JAVA8中定義重複注解與JAVA7相比隻是多了個@Repeatable,使用重複注解的地方JAVA8則比之前的寫法更簡單友善,可讀性更強。