反射|注解|泛型
反射
反射:解决运行期间对某个未知实例,进行调用其方法。反射是一种专门为静态语言(编译时变量的数据类型即可确定的语言,要求使用变量之前必须声明数据类型。如c++、Java、C#等)提供的技术,用于在程序运行时动态的改变程序的状态和行为。运行时,对于任意一个类或对象,都能够调用它的任意字段和方法。
Java 类的成员包括:属性字段、构造函数、方法。
反射API与Java的以上成员相关:
获取 Class 对象的三种方式:
1 | // 1.通过字符串获取Class对象,这个字符串必须带上完整路径名 |
获取成员变量:
- getDeclaredFields:用于获取所有声明的字段,包括公有和私有字段(属性)。
- getFields:仅用来获取公有字段。
获取构造方法:
- getDeclaredConstructors:获取所有构造方法。
- getConstructors :获取公有构造方法。
获取非构造方法:
- getDeclaredMethods:获取所有声明的非构造函数。
- getMethods:获取仅公有非构造函数。
需要注意的是,需要调用 Field/Constructor/Methods.setAccessible(true)
才可使得私有的字段/构造方法/方法得以使用。
注解 Annotation
Java 注解为jdk5.0之后引入的一种注释机制。
Java中的类、方法、变量、参数和包等都可以被标注。Java 标注可以通过反射获取标注的内容。在编译器生成类文件时,标注可以被嵌入到字节码中。
内置注解
Java7之前 一共定义了3个 java.lang中,剩下的4个在java.annotation中。
作用于代码之上:
- Override: 检查该方法是否被重写,若发现父类或者引用的接口中没有该方法,则编译报错。
- Deprecated:标记过时的方法,编译警告。
- SuppressWarnings:提示编译器忽略注解中声明的警告。
作用于其他注解的注解(元注解):
- Retention:标注注解怎么保存,只在代码中,还是编入class,还是运行时可通过反射访问。
- Documented:标注注解是否用在用户文档中。
- Target:标记这个注解应该是哪种 Java 成员。
- Inherited:标记此注解用于哪个注解类
Java7 之后的注解:
- SafaVarargs:Java7 支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- FunctionalInterface:Java8支持,表示一个匿名函数或函数式接口。
- Repeatable:Java8支持,标识某注解可以在同一声明上使用多次。
Annotation架构
Java Annotation组成中3个主干类:Annotation.java, ElementType.java, retentionPolicy.java.
- Annotation为接口
- ElementType 为枚举类,用来制定 Annotation 类型。
- RetentionPolicy 为枚举类型,用来指定 Annotation 策略。