学习笔记之反射泛型信息和注解信息

本文用于记录学习笔记

获取子类传递的类型参数信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A<T>{
public A(){
super();
ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass();//获取子类传递的类型参数信息
Type[] types = pType.pType.getActualTypeArguments();//得到类型数组
Class<?> c = (Class<?>) types[0];
System.out.println(c.getName());//输出类型信息
}
}

class B extends A<String>{

}
class C extends A<Integer> {

}
//测试方法
public void fun() {
new C();
}

结果:
java.lang.Integer

反射注解

  1. 要求
  • 注解保留策略必须是RetentionPolicy.RUNTIME
  1. 反射注解需要从作用目标上返回
  • 类上的注解,需要使用Class获取
  • 方法上的注解,需要使用Method获取
  • 实例域上的注解,需要使用Field获取
  • 构造器上的注解,需要使用Constructor获取
    Method、Field、Constructor都是(或者间接是)AccessibleObject的子类

方法
<T extends Annotation> T getAnnotation​(Class<T> annotationClass)Annotation[] getDeclaredAnnotations​()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Anno5(name = "name1", value = "value1")
Class A{
@Anno(name = "name2", value = "value2")
public void fun(){}
}
@Retention(RetentionPolicy.RUNTIME)
@interface Anno{
String name();
String value();
}

//测试代码,类上的注解
Class <A> c = A.class;
Anno anno1 = c.getAnnotation(Anno.class);
System.out.println(anno1.name() +"--" + anno1.value());//输出注解信息
//方法上的注解
Method m = c.getMethod("fun");//获取方法
Anno anno2 =m.getAnnotation(Anno.class);
System.out.println(anno2.name() + "--" + anno2.value());

结果:
name1--value1
name2--value2