在java.lang.reflect包里的内容折射出了Java语言的语法,其中AnnotatedElement接口,标识一个可以被Java Annotation注解的Java语言元素,也就是说,在java.lang.reflect包下,像Class,Method,Field,Constructor,GenericDeclaration(泛型声明)等Java语法元素对应的实现,都需要实现这个接口;
这个接口不难理解,难理解的是AnnotatedElement的一个子接口AnnotatedType,注意是Annotated Type,这个Type的意义在Java中可以相当牛逼,看下面的注部分或者自己好好百度一下,一定要理解这个Type;
在java.lang.reflect包下,这个接口还有如下几个子接口,AnnotatedArrayType/AnnotatedParameterizedType/AnnotatedTypeVariable/AnnotatedWildcardType,分别对应Java编程语言中Type的四种类型,数组,泛型,类型变量和通配符类型;
注:
java.lang.reflect.Type是Java语言中的超级接口,代表了Java语言中的所有的类型,简单理解的话,就是只要可以定义变量的东西,都是Type;
在Type接口的文档上明确说了,Java语言中的Type包含有四种,raw types, parameterized types, array types, type variables and primitive types,除了raw type之外,其他的都好理解,raw type的解释可以看什么是rawType和Java泛型问题 关于警告:XXis a raw type,千万不要看其他的文章的,也不要将raw type翻译成原生类型来记,primitive types才是原生类型。
刚才我们将AnnotatedType的类名分开成Annotated Type来理解,先不管这个接口是干啥的,如果让我们来设计,AnnotatedType这个接口的实现中应该包含哪些内容?没错Type和注解这个Type的Annotation们,记住这点,没有比这更重要的了。
这一段同样是铺垫。在Java8中,新增了两种类型的注解,TYPE_PARAMETER和TYPE_USE;单是这个TYPE_USE类型的注解就非常疯狂。表演一段:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER,
TYPE_USE })
@Repeatable(Locations.class)
public @interface Location {
String value() default "Los Angeles";
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value = { TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER,
TYPE_USE })
public @interface Locations {
Location[] value();
}
@Location
public class AnnotationLocationDisplayer<@Location A extends Comparable & Serializable, @Location B>
implements @Location Serializable {
private static final long serialVersionUID = 1L;
@Location
private @Location A a;
@Location
private @Location A[] as;
@Location
private @Location A @Location [] as2;
@Location
private @Location A @Location [] @Location [] ass1;
@Location
private @Location B b;
@Location
private List<@Location ? extends Map<@Location String, String>> list;
private List<@Location A> t;
@Location
private List<@Location ? super Map> list2;
private List<@Location String> emails;
@Location
public AnnotationLocationDisplayer() {
}
@Location
public AnnotationLocationDisplayer(@Location @Deprecated A a, @Location B b)
throws @Location InvalidClassException, InvalidMarkException {
@SuppressWarnings("unused")
@Location
String str = "test";
this.a = a;
this.b = b;
}
@Location("before method")
public @Location("before return type") String test(
@Location("receiver parameters") AnnotationLocationDisplayer<@Location("receiver parameters") A, @Location("receiver parameters") B> this,
@Location("before method parameter1") String a1, @Location("before method parameter2") String a2)
throws @Location("before throws exception") IndexOutOfBoundsException {
@Location("before local variable")
String str = "str";
return str;
}
}
如上面的代码所展现的,从Java8开始,几乎是所有有意义的地方,都可以添加注解了。
AnnotatedArrayType/AnnotatedParameterizedType/AnnotatedTypeVariable/AnnotatedWildcardType
未完待续