注解和反射学习笔记

时间:2021-07-12
本文章向大家介绍注解和反射学习笔记,主要包括注解和反射学习笔记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 注解 Annotation

1.1 介绍

  1. 作用:对程序做出解释,可被其他程序读取,如编译器等;有检查和约束功能;

  2. 格式:“ @注释名(参数值) ”;

  3. 使用场景:package,class,method,field;通过反射机制实现对元数据的访问;

1.2 内置注解

  1. @Override:只适用于修辞方法(method),表示一个方法声明重写超类中的另一个方法声明;定义在java.lang下;

  2. @Deprecated:表示不鼓励使用,适用于修辞方法、属性、类,代码上会出现删除线效果;

  3. @SuppressWarnings:用于抑制编译时的警告信息,如定义变量后未使用有警告,使用后警告消失;有参数,直接使用即可;

1.3 元注解 meta-annotation

  1. 作用:注解其他注解,对其他注解进行说明,多用在写自定义注解时;

  2. 具体:

    key: 查看源代码确认作用域.

    • @Target:用于描述注解的使用范围,如类、方法或构造器上;

    • @Retntion:用于描述注解的生命周期,在什么级别还有效,RUNTIME(运行时有用) > CLASS(成为类时有用) > SOURCE(源代码中有用),一般都是RUNTIME;一般是固定形式:

    • @Documented:是否将我们的注解生成在JAVAdoc中;

    • @ Inherited:表示子可以继承父的注解,注意只对类有用,其他类型不会继承;

1.4 自定义注解

  1. 形式:(一般固定形式)

    //写自定义注解时,加一些元注解
    @Target({ElemenType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnnotation{
        String name();
    }

  2. 具体:

    key: 注解的参数不是方法.

    • 参数可以设置默认值:

    • 注解可以显式赋值,若无默认值则必须赋值:上面是自定义注解的使用,使用时参数赋值可以不按顺序,下面是注解的具体内容:

    • 若只有一个值,一般用value命名,使用时可直接赋值,不用写参数名(只在参数名为value是省略);


2 反射 Reflection

2.1 概述

  1. 静态与动态:

    • 动态:可以在运行时根据某些条件改变代码结构;

    • 静态:运行时结构不变’

  2. 反射:允许程序在执行时借助Reflection API取得任何类的内部信息,并可以直接操作任意对象的内部属性和方法;

  3. 方法:getClass()方法;

2.2 获取反射

  1. Class类:管理反射的核心类,Class本身是类,Class对象只能由系统创建,类加载加载之后,会有一个Class类型的对象,一个类只有一个Class对象,这个对象有这个类完整的结构信息,因此可以透过对象看类:

  2. 特点:灵活但是影响性能;

  3. 实例:

    • 在类的主方法中使用:(注意大写)

      这个Class类有很多方法;

    • 底层逻辑:每个程序唯一的class是Object的扩展对象,Object对象中定义了Class类的getClass方法,而Class是所有类的源头,所以才可以建Class类来获得当前类的完整信息,即通过对象来获取类的信息:

  4. 获取Class类的方法:

    key: 对于每个类,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了某个特定结构的相关信息.

    • Class类的常用方法:、

    • 获取方法

    • 实例:下图利用上图的类进行演示,这里面删除了一些泛型

    结果:

2.3 不同类型的Class对象

  1. 实例:

    key: 只要元素类型和维度一样,就是同一个Class,如一维数组长度不同也是同一个类.

    输出:

  2. 内存中的类:

    key: 加载、链接与初始化.

    • 加载:将class文件的字节码加载到内存,静态转动态,生成代表这个类的Class对象,因此每次都是获取而不能自己创建

    • 链接:将二进制代码合并进JVM的运行状态中,需要验证、准备(为static修饰的分配内存、设置变量初始值,都在方法区中)和解析过程(符号引用替换为直接引用);

    • 初始化:JVM执行类构造器(构造类的信息);初始化时若子类的父类没初始化,先初始化父类;保证正确;

2.4 通过反射获取注解

  1. ORM:对象关系映射(Object Relation Mapped),类与表、属性与字段、对象和记录;

  2. 用法:通过反射机制来获得自定义注解的内部信息;

  3. 实例:上图为使用注解,下图为自定义注解内容

原文地址:https://www.cnblogs.com/youngsam/p/15003355.html