定时任务
开启定时任务
@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进行分类 | 创建对象 |
- 获取成员变量
- Field[] getFields() 获取public修饰的成员变量
- Field getField(String name) 获取指定名称的public修饰的成员变量
- Field[] getDeclaredFields() 获取所有的成员变量
- Field[] getDeclaredField(String name) 获取指定名称的成员变量
- 获取成员方法
- Constructor<?>[] getConstructors()
- Constructor getConstructor(类<?>... parameterTypes)
- Constructor getDeclaredConstructor(类<?>... parameterTypes)
- Constructor<?>[] getDeclaredConstructors()
- 获取成员方法
- Method[] getMethods()
- Method getMethod(String name,类<?>... parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name,类<?>... parameterTypes)
- 获取类名
- 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对象的方式
-
Class.forName("全类名");将字节码文件加载进内存,返回Class对象
-
类名.class;通过类名的属性class获取
-
对象.getClass();getClass()方式在Object类中定义着。
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取class对象都是同一个。
注解
注解的分类:
- 编写文档:通过代码里标识的元数据生成文档
- 代码分析:通过代码里标识的元数据对代码进行分析
- 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查
jdk内置注解:
- @Override:检查该数据标识的方法是否是继承自父类(接口)
- @Deprecated:将该注解标注的内容,已过时
- @SuppressWarnings:压制警告
自定义注解:
-
格式:
元注解
public @interface 注解名称{} -
本质:注解本质就是一个接口,该接口默认继承Annotation接口
-
属性: 接口中可以定义的成员方法
- 要求:
- 数据返回值类型
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
- 数据返回值类型
- 要求:
-
元注解:用于描述注解的注解
- @Target: 描述注解能够作用的位置
- @Retention: 描述注解能保留的阶段
- @Documented: 描述注解是否被抽取到api文档中
- @Inherited:描述注解是否被子类继承