前言
今天学习了注解以及利用注解和反射去写一个工程。以及正则表达式的了解
一、注解
1、什么是注解
注解 : JDK1.5新特性 —> 标注
作用 :
1.注释
2.强制检查语法
3.可以在使用注解的同时配置一些数据,在程序运行期间可以通过反射操作注解,获取配置的数据进行使用
4.注解可以存在于Class文件中
5.大量的代替了配置文件的存在
语法 :@注解类型(数据)
位置 :默认可以使用在任意位置,可以通过元注解Target规定注解类型的使用位置
注解的分类:
- JDK内置注解:1、常见的内置注解 2、元注解:注解注解的注解
- 自定义注解
示例代码如下:
@SuppressWarnings("all")//消除代码中所有的警告
public class Class_01_Annotation {
public static void main(String[] args) {
String str = "jj";
}
public static void smlie() {
}
@Override//重写的注解
public String toString() {
return super.toString();
}
}
2、自定义注解
示例代码如下:
public class Class_02_Annotation {
public static void main(String[] args) {
@Number
String anime1 = "名侦探柯南";
@Number
String anime2 = "迪迦奥特曼";
@Number
String anime3 = "妖精的尾巴";
@Number
String anime4 = "刀剑神域";
}
}
@Target(ElementType.LOCAL_VARIABLE)//表示注解的作用范围
@Retention(RetentionPolicy.RUNTIME)//表示自定义的注解生命周期
@interface Number{
int value() default 10;//default是默认10 注解若需要10就可以不用定义参数的值
}
3、注解和反射
示例代码如下:
/*
模拟水果店每天的上货清单 : 了解
每天生成的清单中所有的水果都必须存在具体的数量 !null值 0->今天不上货 >0 按照要求上具体的数量的水果
1)构建生成今天的上货清单
2)通过注解解析器->功能 : 对清单中的水果上货数量进行完善
需要获取所有的上货水果,然后进行遍历
判断当前属性值!=null,
如果!=null,代表之前手动位当前水果的上货数量赋过值,以这个数量为主
如果==null,
先判断当前属性上是否存在@Num这个注解,如果不存在代表没有默认的上货数量,不上货,就需要为当前属性的值赋值为0
如果存在,需要获取这个@Num注解中value字段的值,为当前属性进行赋值
最终返回所有水果都存在上货数量的进入上货清单
*/
public class Class_FruitList {
public static void main(String[] args) throws IllegalAccessException {
FruitList fruitList = new FruitList();
fruitList.apple = 100;
System.out.println(fruitList);
//完善清单
fruitList = test(fruitList);
System.out.println(fruitList);
}
//注解解析器 : 完善水果清单
public static FruitList test(FruitList list) throws IllegalAccessException {
//获取反射的源头,FruitList类型的Class对象
Class<FruitList> cls = FruitList.class;
//需要获取FruitList所有的属性,然后进行遍历
Field[] fields = cls.getDeclaredFields();
for(Field field:fields){
//判断当前属性值!=null,
if (field.get(list)==null){
// 先判断当前属性上是否存在@Num这个注解
if(field.isAnnotationPresent(Num.class)){
//如果存在,需要获取这个@Num注解
Num anno = field.getAnnotation(Num.class);
//从上一步获取到的注解实例中拿到锁配置的value属性值
int num = anno.value();
//使用所配置的value字段值,为当前属性赋值
field.set(list,num);
}else{
//如果不存在代表没有默认的上货数量,不上货,就需要为当前属性的值赋值为0
field.set(list,0);
}
}
}
return list;
}
}
class FruitList{
@Num(20)
Integer apple;
@Num
Integer banana;
@Num
Integer pear;
Integer watermelon;
public FruitList() {
}
public FruitList(Integer apple, Integer banana, Integer pear, Integer watermelon) {
this.apple = apple;
this.banana = banana;
this.pear = pear;
this.watermelon = watermelon;
}
public Integer getApple() {
return apple;
}
public void setApple(Integer apple) {
this.apple = apple;
}
public Integer getBanana() {
return banana;
}
public void setBanana(Integer banana) {
this.banana = banana;
}
public Integer getPear() {
return pear;
}
public void setPear(Integer pear) {
this.pear = pear;
}
public Integer getWatermelon() {
return watermelon;
}
public void setWatermelon(Integer watermelon) {
this.watermelon = watermelon;
}
@Override
public String toString() {
return "FruitList{" +
"apple=" + apple +
", banana=" + banana +
", pear=" + pear +
", watermelon=" + watermelon +
'}';
}
}
//水果上货数量
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Num{
int value() default 10;
}
二、正则表达式
可以理解为新的一种语言字符。
作用:正则表达式是用来描述具有一定特征的字符串的特殊字符串
ab*: a 若干个 b ->* 零个及以上 , 匹配: a ab abbbbb abbbbbbb 不能 bbbbb。
(cd): ()->组,改变了优先级 ,若干个 cd, 匹配: “” cd cdcd cdcdcd
ab(cd): a 若干个 b 和若干个 cd 匹配: a ab abbbbb abbbbbbb acd acdcd abbbbbcd abcd
ab|(cd)*: |或的优先级低 匹配: a ab cd ab|c : 匹配 ab c
总结
注解和正则总结的比较浅显。只需要了解 即可。明天加油!