注解的简单使用场景

注解和类型的相关知识,这里就不做详细介绍,大家有兴趣的话,可以自己买本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;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值