28°

定时任务、反射、注解

定时任务

开启定时任务

@EnableScheduling 在spring boot启动类加上,表示开启定时任务

设置定时任务

@Scheduled 设置需要定时执行的方法

参数cron

字段 允许值 允许的特殊字符
second 0-59 ,-*/
minute 0-59 ,-*/
hour 0-23 ,-*/
day of month 1-31 ,-*/?LWC
month 1-12 ,-*/
day of week 0-7(0和7都是星期天) ,-*/?LW#
特殊字符 表示含义
, 枚举
- 区间
* 任意
/ 步长
日/星期冲突匹配
L 最后
W 工作日
C 和calendar联系后计算的值
# 星期,4#2表示的是第二个星期四

例子1

    //周五的每分钟第0,第1,第2,第3秒都运行一次
    @Scheduled(cron = "0,1,2,3 * * * * 5")
    public void aa() {...}

例子2

    //周五的每分钟,从零秒启动,每四秒都运行一次
    @Scheduled(cron = "0/4 * * * * 5")
    public void aa() {...}

反射

反射机制:将类的各个组成部分封装成对象

java文件在计算机中的三个阶段

Source 源代码阶段 Class 类对象阶段 Runtime 运行阶段
将java文件通过javac编译成class文件,通过ClassLoader(类加载器)将class字节码文件加载进内存, 通过Class类对象对该类的成员变量、构造方法、成员方法进行分类,分别加载进fields、constructors、methods进行分类 创建对象
  1. 获取成员变量
    1. Field[] getFields() 获取public修饰的成员变量
    2. Field getField(String name) 获取指定名称的public修饰的成员变量
    3. Field[] getDeclaredFields() 获取所有的成员变量
    4. Field[] getDeclaredField(String name) 获取指定名称的成员变量
  2. 获取成员方法
    1. Constructor<?>[] getConstructors()
    2. Constructor getConstructor(类<?>... parameterTypes)
    3. Constructor getDeclaredConstructor(类<?>... parameterTypes)
    4. Constructor<?>[] getDeclaredConstructors()
  3. 获取成员方法
    1. Method[] getMethods()
    2. Method getMethod(String name,类<?>... parameterTypes)
    3. Method[] getDeclaredMethods()
    4. Method getDeclaredMethod(String name,类<?>... parameterTypes)
  4. 获取类名
    1. String getName()

例子1

    //获取字节码文件的class类对象
    Class<Person> personClass = Person.class;
    //获取public修饰的成员变量
    Field field = personClass.getField("a");
    Person person = new Person();
    Object o = field.get(person);
    System.out.println(o);

例子2

    //获取字节码文件的class类对象
    Class<Person> personClass = Person.class;
    //获取protected的成员变量
    Field d = personClass.getDeclaredField("d");
    Person person = new Person();
    //忽略访问权限修饰符安全检查,
    d.setAccessible(true);//暴力反射
    Object o = d.get(person);
    System.out.println(o);

获取Class对象的方式

  1. Class.forName("全类名");将字节码文件加载进内存,返回Class对象

  2. 类名.class;通过类名的属性class获取

  3. 对象.getClass();getClass()方式在Object类中定义着。

    同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取class对象都是同一个。

注解

注解的分类:

  1. 编写文档:通过代码里标识的元数据生成文档
  2. 代码分析:通过代码里标识的元数据对代码进行分析
  3. 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查

jdk内置注解:

  1. @Override:检查该数据标识的方法是否是继承自父类(接口)
  2. @Deprecated:将该注解标注的内容,已过时
  3. SuppresWarnings:压制警告

自定义注解:

  • 格式:
    元注解
    public @interface 注解名称{}

  • 本质:注解本质就是一个接口,该接口默认继承Annotation接口

  • 属性: 接口中可以定义的成员方法

    • 要求:
      • 数据返回值类型
        • 基本数据类型
        • String
        • 枚举
        • 注解
        • 以上类型的数组
  • 元注解:用于描述注解的注解

    • @Target: 描述注解能够作用的位置
    • @Retention: 描述注解能保留的阶段
    • @Documented: 描述注解是否被抽取到api文档中
    • @Inherited:描述注解是否被子类继承

本文转载自博客园,原文链接:https://www.cnblogs.com/Juaoie/p/13198236.html

全部评论: 0

    我有话说: