注解和类型的相关知识,这里就不做详细介绍,大家有兴趣的话,可以自己买本thinking in java看看(主要是怕教坏人).下面主要介绍一个注解在表单验证的一个小小的应用场景!(主要是无聊,记录一下自己的学习历程)
下面这种图主要是这个小例子所用到的四个类的一个结构,就是放在了同一个包里
---------------------------------------------------------------------测试类-------------------------------------------------------------------------------------------
package annotation;
/**
* @Auther: lyf
* @Date: 2019-08-08 15:58
* @Description: 注解必须要有对应的解析器进行解析, 注解才会起作用
* 下面以小见大,介绍一下注解在表单验证时注解的一个小小的应用场景
* 1.注解BeanNotNull作用在类的属性上,注解BeanNotNull的成员属性只有value一个
* 2.BaseClass里面的isNull方法,就是调用BeanNotNull解析器的一个触发方法
* 3.BaseClass的子类一调用isNull,就会先获取子类的类型信息Class,然后通过getDeclaredFields方法
* 获取到类里面的所有属性(不包含父类的属性)
* 4.遍历所有的属性对象Filed,通过属性对象拿到类的属性上面的BeanNotNull注解,
* 如果注解存在就判断该属性是否是null,是的话,就将注解BeanNotNull里面value成员的值赋值给err_message字段
* 并且返回true,告诉isNull调用者,这个类里面有属性的值为null
* 5.isNull对基本数据类型不起作用
* 6.这个注解能作用在所有继承了Object的属性上,如果想对基本数据类型起作用,那么对isNull解析方法做一下兼容操作就行
*/
public class AnnotationTest {
public static void main(String[] args) {
User user = new User();
user.setName("哈哈");
//调用isNull方法,其实就是调用了注解的解析器
if (user.isNull()) {
//输出错误信息,其实就是@BeanNotNull("age不能为空")里面的'age不能为空'内容
System.out.println(user.getErr_message());
}
}
}
---------------------------------------------------------------------注解类-------------------------------------------------------------------------------------------
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BeanNotNull {
String value() default "";
}
-----------------------------------------------BaseClass基类,这个类的作用就是让其子类自带解析注解的功能--------------------------------------
package annotation;
import java.lang.reflect.Field;
/**
* @Auther: lyf
* @Date: 2019-08-08 15:29
* @Description:
*/
public abstract class BaseClass {
private String err_message;
public boolean isNull() {
//获取类型信息
Class<? extends BaseClass> clazz = this.getClass();
//获取到类里面的所有内部属性,不包含父类的属性字段
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (Field field : fields) {
//获取到属性上指定名称的注解
BeanNotNull isNull = field.getAnnotation(BeanNotNull.class);
if (isNull != null) {
try {
//这里没有做兼容,如果属性是那8中基本数据类型的话
//将不起作用
//将属性设置为可获取的,否则如果是private属性的话将会抛出异常
field.setAccessible(true);
if (field.get(this) == null) {
err_message = isNull.value();
return true;
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
return false;
}
public String getErr_message() {
return err_message;
}
}
-------------------------------------------------------------------------User注解作用的地方 --------------------------------------------------------------------------------
package annotation;
/**
* @Auther: lyf
* @Date: 2019-08-08 15:35
* @Description:
*/
public class User extends BaseClass {
@BeanNotNull("name不能为空")
private String name;
@BeanNotNull("age不能为空")
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}