类型注解
首先我们要知道在jdk1.8之前的时候我们的注解只能是使用在声明的地方,但是在jdk1.8之后我们的注解添加了类型注解,那么注解就可以使用在任何地方
在jdk8.0之后,关于元注解@Target的参数ElementType枚举类的枚举值添加了两种:
- TYPE_PARAMETER
- 表示该注解能写在类型变量的声明语句中
- 这里的类型变量可以是基本类型变量,也可以是引用类型变量
- eg:泛型声明(泛型就是一个类,所以泛型声明就是一种引用类型变量的声明)
- 表示该注解能写在类型变量的声明语句中
- TYPE_USE
- 表示该注解可以写在任何使用类型(基本数据类型和引用数据类型)的语句中
这里我们通过一个例子来理解类型注解
eg::
- 首先我们先创建一个类型注解:
package 注解.类型注解;
import java.lang.annotation.*;
@Inherited
@Retention(RetentionPolicy.RUNTIME)
/*
之所以说我们创建的这个注解是一个类型注解,就是因为我们创建的这个自定义注解使用Target元注解修饰了,并且
我们的Target元注解中的配置参数中有ElementType.TYPE_PARAMETER还有ElementType.TYPE_USE
*/
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.TYPE_PARAMETER,ElementType.TYPE_USE})
public @interface MyAnnotation {
String value() default "hello";
}
- 然后我们再来测试我们创建的这个类型注解:
package 注解.类型注解;
import java.util.ArrayList;
/*
这里能使用我们创建的自定义注解类型是因为我们的自定义注解(也就是这里我们的类型注解)使用@Target元注解修饰了,并且修饰的元注解中的参数的ElementType []中
有ElementType.PARAMETER
*/
public class Demo<@MyAnnotation T> {
/*
这里之所以可以使用我们的自定义注解是因为我们的自定义注解(也就是我们创建的类型注解)使用@Target元注解修饰了,并且修饰的元注解中的参数的ElementType[]
中有ElementType.TYPE_USE
*/
public void show()throws @MyAnnotation RuntimeException{
/*
这里之所以可以使用我们创建的自定义注解,也是因为我们的Target元注解中有ElementType.TYPE.USE
*/
ArrayList<@MyAnnotation String> arrayList = new ArrayList<>();
/*
这里之所以可以使用我们创建的自定义注解,也是因为我们的Target元注解中有ElementType.TYPE.USE
*/
int x = (@MyAnnotation int)102.1;
}
}