首页 > 技术文章 > Java 注解机制/泛型机制

ruhuanxingyun 2020-07-25 10:23 原文

一、注解机制

  1. 注解

    A. 定义:注解是JDK5中引入的一个新特性,用于对代码进行说明,可以对包、类、接口、方法、字段、局部变量等进行注解;

    B. 注解中内容获取:通过反射(java.lang.reflect.AnnotatedElement)获取注解中内容如:属性。

  2. Java自带注解

    A. @Override:重写实现类中某个方法;

    B. @Deprecated:标明某个类或方法过时;

    C. @SuppressWarnings:标明要忽略的警告。

  3. 元注解

    A. @Retention:标明注解被保留的时间范围;

public enum RetentionPolicy {
 
    SOURCE,   // 源文件保留
    CLASS,    // 编译期保留,默认值
    RUNTIME   // 运行期保留,可通过反射去获取注解信息
}

    B. @Target:标明注解使用的范围;

复制代码
public enum ElementType {
 
    TYPE,             // 类、接口、枚举类
 
    FIELD,            // 成员变量(包括:枚举常量)
 
    METHOD,           // 成员方法
 
    PARAMETER,        // 方法参数
 
    CONSTRUCTOR,      // 构造方法
 
    LOCAL_VARIABLE,   // 局部变量
 
    ANNOTATION_TYPE,  // 注解类
 
    PACKAGE,          // 可用于修饰:包
 
    TYPE_PARAMETER,   // 类型参数,JDK 1.8 新增
 
    TYPE_USE          // 使用类型的任何地方,JDK 1.8 新增
 
}
复制代码

    C. @Inherited:标明注解可以被子类继承;

    D. @Documented:标明在使用javadoc工具为类生成帮助文档时是否要保留其注解信息;

    E. @Repeatable:重复注解,允许在同一申明类型(类、属性和方法)的多次使用同一个注解,创建自定义注解时,加上该注解并指向存储注解,就可以重复使用自定义注解,如@ComponentScan,是JDK 1.8新增的;

    F. @Native:使用注解修饰成员变量,表示这个变量可以被本地代码引用,是JDK 1.8新增的;

  4. 注解实现原理:注解@interface 是一个实现了Annotation接口的 接口, 然后在调用getDeclaredAnnotations()方法的时候,返回一个代理$Proxy对象,这个是使用jdk动态代理创建,使用Proxy的newProxyInstance方法时候,传入接口 和InvocationHandler的一个实例(也就是 AnotationInvocationHandler ) ,最后返回一个代理实例;期间,在创建代理对象之前,解析注解时候 从该注解类的常量池中取出注解的信息,包括之前写到注解中的参数,然后将这些信息在创建 AnnotationInvocationHandler时候 ,传入进去 作为构造函数的参数;当调用该代理实例的获取值的方法时,就会调用执行AnotationInvocationHandler里面的逻辑,将之前存入的注解信息 取出来。

  5. 自定义注解

    A. 定义:自定义注解就是根据自己的需求定义注解,并用元注解对自定义注解进行注解;

    B. 作用:使配置化变成注解化、继承实现到注解实现、实现模块解耦如:AOP和shiro权限注解。

 

二、泛型机制

  1. 泛型

    A. 定义:泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制即类型擦除,省去了强制转换,避免ClassCastException。泛型的本质是为了参数化类型,也就是说所操作的数据类型被指定为一个参数;

    B. 类型擦除:将所有的泛型表示即尖括号中的内容都替换为具体的类型;

    C. 意义:适用于多种数据类型执行相同代码,即代码复用

    D. 泛型参数类型的获取:通过反射(java.lang.reflect.Type)获取泛型。

  2. 通配符

    A. ?:表示不确定的java类型,若是多个限制,采用&符号,通常用于泛型方法的调用代码和形参

      ?:无界通配符

      <? extends E>:上界通配符,表明参数化类型可能是所指定的类型,或者此类型的子类;

      <? super E>:下界通配符,表明参数化类型可能是所指定的类型,或者此类型的父类;

    B. T(type):表示一个具体的java类型,通常用于泛型类和泛型方法的定义

    C. K V(key value):分别代表java键值中的key value;

    D. E(element):代表Element;

    E. S(Subtype):

  3. 分类

    A. 泛型类:分一元泛型(T)和多元泛型(K V);

    B. 泛型接口

    C. 泛型方法:是在调用方法的时候指明泛型的具体类型;

  4. 类型擦除带来的局限性

    A. 泛型不支持8种基本数据类型;

    B. 不能实例化泛型类型;

    C. 不能创建具体类型的泛型数组。

 

推荐阅读