Java 反射之AnnotatedElement

基础知识铺垫一下

在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们,记住这点,没有比这更重要的了。

ElementType TYPE_USE

这一段同样是铺垫。在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开始,几乎是所有有意义的地方,都可以添加注解了。

接口AnnotatedType和他的子类们

AnnotatedArrayType/AnnotatedParameterizedType/AnnotatedTypeVariable/AnnotatedWildcardType

未完待续

你可能感兴趣的:(Java)