注解Annotation
基本概念
Annotation是JDK5.0新增的功能,其和类Class、枚举Enum以及接口Interface均属于并列关系。
Annotation就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理逻辑。程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗。
使用场所
- 场所1:生成文档相关的注解
- 场所2:在编译时进行格式检查
JDK内置的三个基本注解
@Override:限定重写父类方法,该注解只能用于方法
@Deprecated:用于表示所修饰的元素(类, 方法等)已过时。
@SuppressWarnings:抑制编译器警告
- 场所3:跟踪代码依赖性,实现替代配置文件功能
自定义注解与4种元注解(JDK8.0之前)
- 自定义注解格式(可参考系统提供的@SuppressWarnings注解的写法)
- 注解声明为:@interface
- 内部定义成员,通常使用value表示
- 可以使用default指定成员的默认值
- 如果自定义注解没有成员,表明是一个标识作用。
- JDK提供的4种元注解(元注解:针对注解的注解)
- @Retention:指定所修饰的注解的生命周期。值:SOURCE/CLASS(默认)/RUNTIM(只有它才能通过反射获取)
- @Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素。
*如下出现的频率较低*
- Documented:表示所修饰的注解在被javadoc解析时可以被保留下来。
- Inherited:被它修饰的 Annotation 将具有继承性。
- 自定义注解案例
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
@Inherited
public @interface MyAnnotation {
String value() default "hello";
}
JDK8.0新增的注解特性
- 新增可重复注解
- 新增两个类型注解:TYPE_PARAMETER、TYPE_USE
泛型Generic
概念说明
泛型的核心本质
- 参数化类型(Parameterized type),即向类/接口/方法传入附加参数。如允许程序员在创建集合时再指定集合元素的类型,如:List,这表明该List只能保存字符串类型的对象,该String类型也可以在List类其他多个地方使用。
- JDK1.5之后支持泛型。
泛型的重要特征
- 泛型只在编译阶段有效(不同参数类型T组成的泛型,其本质都是同一个类型)。在编译之后(生成class文件)程序会采取去泛型化的措施。
- 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
使用注意点
- 不能在静态方法和异常类里面使用类定义的泛型类型(静态方法可以使用泛型方法)
- 可以自定义的泛型结构:类/接口/方法
泛型类和泛型接口
基本概念
- 泛型类型用于类/接口的定义中,被称为泛型类/接口。
- 泛型的类型参数只能是引用类型,不能是基本类型
- 在实例化泛型类时,可以不指定T的具体类型,如不指定的话则为Object类型。
```xml
//自定义泛型类格式
public class Fly {
//构造器不需要再手动指明泛型了
public Fly() {
}
private T name;
public T getName() { return name;
}
public void setName(T name) { this.name = name;
}
}
//自定义泛型接口格式
public interface IFlyable {
T say(T name);
}
//使用
Fly