17、注解和反射

注解概述

  • Annotation注解,也叫元数据。
  • 作用:编写文档、代码分析、编译检查。现在开发中,用注解替换xml配置文件。
  • 格式:“@注释名”,还可以添加一些参数值。通过反射机制编程实现对这些元数据的访问。
    17、注解和反射

基本内置注解

  • @Override:需要重写
  • @Deprecated:不建议使用
  • @SuppresWarnings:有参数,去掉程序中的警告

注解声明、本质和成员

  • 声明注解
    public @interface MyAnnotation{ }
  • 注解的本质就是一个interface。
    17、注解和反射

注解属性类型

  • 基本数据类型(四类八种)
  • String类型
  • 枚举类型(enmu)
  • 注解类型
  • Class类型
  • 以上类型的一维数组类型
    17、注解和反射

注解属性的使用

  • 如果一个注解有属性,那么在使用注解时,要对属性进行赋值操作。
  • 如果一个注解的属性有多个,都需要赋值。
  • 可以给属性赋默认值(注解处用default)。
  • 如果属性是数组类型:①可以直接使用 属性名={ };②数组值只有一个时可以省略“{}”。
  • 对于属性名称value的操作:
    17、注解和反射

元注解

用于修饰注解的注解,用于描述注解在什么范围及什么阶段使用。
四个元注解介绍:

  • @Retention:指定注解信息在哪个阶段存在。
    • SOURCE:编译阶段;
    • CLASS:解析执行阶段;
    • RUNTIME:在JVM中。
  • @Target:标注注解的执行位置(ElementType.XXX)。
  • @Document:生成注解信息到javadoc文档中。
  • @InHerited:让注解有自动继承性。
  • @Retention的值应该是RUNTIME,因为会结合反射技术来使用;@Target一般使用TYPE或METHOD。

反射介绍

反射,一种计算机处理方式,对于任一对象,都能动态获取信息以及动态调用对象方法功能。
17、注解和反射
反射的优缺点:

  • 优点:
    • 提高了程序的灵活性和扩展性;
    • 降低耦合性,提高自适应能力;
    • 允许程序创建和控制任何类的对象,无需提前硬编码目标类。
  • 缺点:
    • 性能问题:反射机制应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
    • 反射会模糊程序内部逻辑,带来维护问题。

反射的API

  • Class介绍及获取
    java中的Class可以代表任意的类或者接口类型。
    如何获取一个Class?
    • 如果有一个对象,可以直接通过从Object类中继承的getClass方法获取;
    • 可以通过类包(接口)直接调用其属性.class获取;
    • (推荐,无耦合)Class.forName()
      17、注解和反射

为什么要获得Class?
反射操作中会获取类的成员,Constructor、Filed、Method,需要通过Class来获得其他对象。

  • Constructor
    单个构造器,得到它就可以实例化对象。
    • getConstructor获取类的public构造;
    • getConstructors获取类的所有public构造;
    • getDeclaredConstructor获取类的private构造;
    • getDeclaredConstructors获取类的所有private构造。
      17、注解和反射
  • Filed
    如何获取Filed?
    • getFiled获取类的public属性;
    • getFileds获取类的所有public属性;
    • getDeclaredFiled获取类的private属性;
    • getDeclaredFileds获取类的所有private属性。
      赋值、取值操作
      17、注解和反射
  • Method
    如何获取一个Mehod对象?
    • getMethod获取类的方法,包括父类的;

    • getMethods获取类的所有方法,包括父类的;

    • getDeclaredMethod获取仅本类的方法;

    • getDeclaredMethods获取仅本类的所有方法。
      17、注解和反射

    • 执行方法,invoke
      17、注解和反射

    • Method的invoke使用注意事项

    • 调用static方法

      • 方法是静态的,invoke调用时不需要传递对象。
        17、注解和反射
    • 调用参数是数组类型的方法

      17、注解和反射
      17、注解和反射

反射赋值案例

17、注解和反射

代理

17、注解和反射
newProxyInstance描述
17、注解和反射
invocationHandler详解

  • 是一个接口,接口中声明了一个invoke()(与反射不同)方法,它是在代理对象调用行为时会执行的方法,invoke方法有三个参数:
    17、注解和反射

动态代理在开发中可以完成性能监控、权限控制、日志记录等操作。