Java 注解和反射


一 . 注解(Annotation)

  1 . 定义

      不是程序本身,不是必要的,可以对程序做出解释

      可以被其他程序 读取

  2 . 格式:以 @ 开头,后面跟注解名,还有可以加参数值

  3 . 内置注解:

      1. @Override:表示重写父类的方法

      2 . @Deprecated:表示不推荐使用的

      3 . @SuppressWarnings:用于抑制编译时的警告信息

  4 . 元注解(meta-annotation)

      负责解释注解的 注解

      1 . @Target:用于描述注解的 使用范围,用 value 赋值

      2 . @Retention:用于描注解的 生命周期,用 value 赋值

              默认是 RUNTIME

                SOURCE < CLASS < RUNTIME

              编译的时候 < 类中 <  运行的时候

      3 . @Documented:表示注解是否生成在 Javadoc中

      4 . @Inherited:表示子类是否继承父类的注解

  5 . 自定义注解:@interface

      格式:public @interface 注解名 { 定义内容 } 

       

二 . 反射机制(Reflection)

  1 . 了解动态语言:运行时,代码可以根据条件改变自身的结构(JavaScript,PHP,Python)

  2 . 了解静态语言:运行时,结构不可改变(Java,C,C++)

    但是Java 可以通过 反射机制,获得类似于动态语言的特性

  3 . 反射机制允许程序执行时,通过Reflection API 获取任何类的内部信息,

                   并可以直接操作任意对象内部的属性和方法

                 (可以取到 private 修饰的属性方法)

  4 . 加载完类后,堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),

     这个对象包含了完整的类的结构信息,

     这个对象就像 一面镜子,我们可以通过 这个对象 来 看到 类的结构,

     所以形象的称之为 反射

  5 .  优缺点:

    优点:可实现动态创建对象和编译,灵活性强

    缺点:对性能有影响

  6 . 通过反射获取对象

    hashcode一样说明 类在被加载完后,每个类只会有一个 Java对象

  7 . Class类的常用方法

  8 . 获取class类的实例

     

三 . Java 内存分析

  1 . 

     堆:存放 new的对象和数组,可被共享,不会存放别的对象引用

     栈:存放 基本变量类型(包含其具体数值)和引用对象的变量

        会存放这个引用在堆里的具体地址

     方法区(特殊的堆):包含所有的 class类和 static 变量

四 . 通过反射操作泛型

  1 . 泛型

      我的理解:把类型 像变量一样传给 类或方法,类或者方法里究能使用这个变化的类型了

              可以把泛型理解为 一个变量,需要我们去赋值

五 . 反射操作注解

  代码: 自定义注解                         

       操作类:

       测试: