美文网首页
Java 自定义注解

Java 自定义注解

作者: sunpy | 来源:发表于2018-12-12 18:40 被阅读5次
秀秀.jpg

介绍

注解又叫做元数据,以一种形式化的方式为我们在代码中添加规则,使我们无须手动去获取数据,可以通过注解定义的规则,在我们需要的时刻,随时获取数据。

元注解

  1. @Target:表示该注解可以用于什么地方,就是注解使用的目标对象
    @Target(ElementType.TYPE) :类、接口(包括注解类型)或enum声明。
    @Target(ElementType.FIELD):字段、枚举的常量。
    @Target(ElementType.METHOD):METHOD:方法声明。
    @Target(ElementType.PARAMETER):方法参数声明。
    @Target(ElementType.CONSTRUCTOR):构造器的声明。
    @Target(ElementType.LOCAL_VARIABLE):局部变量声明。
    @Target(ElementType.ANNOTATION_TYPE):注解类型声明。
    @Target(ElementType.PACKAGE):包声明。
  2. @Retention:表示需要在什么级别保存该注解信息,就是注解保存的策略。
    @Retention(RetentionPolicy.SOURCE):注解将被编译器丢弃。
    @Retention(RetentionPolicy.CLASS):注解在class文件中可用,在jvm中丢弃。
    @Retention(RetentionPolicy.RUNTIME):jvm在运行期也保留注解,可以通过反射机制来读取注解的信息。
  3. @Documented:将此注解包含在Javadoc中。
  4. @Inherited:允许子类继承父类中的注解。

练习1:自定义注解实现校验

/**
 * 字符串判空校验
 * @author sunpy
 *
 */
@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SunpyValidateString {
    boolean isEmpty();
}

/**
 * int/Integer最大值校验
 * @author Administrator
 *
 */
@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SunpyValidateMax {
    int max();
}

/**
 * int/Integer最小值校验
 * @author sunpy
 *
 */
@Documented
@Inherited
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SunpyValidateMin {
    int min(); 
}
/**
 * 注解模型类
 * @author sunpy
 *
 */
public class User {

    @SunpyValidateString(isEmpty = false)
    private String username;

    @SunpyValidateMax(max = 120)
    @SunpyValidateMin(min = 1)
    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
/**
 * 注解解析器
 * @author sunpy
 *
 */
public class ValidatorResolver {
    
    public static <T> boolean validate(T t) throws Exception {
        Field[] fields = t.getClass().getDeclaredFields();
        
        for (Field field : fields) {
            field.setAccessible(true);
            SunpyValidateString sunpyValidateString = field.getAnnotation(SunpyValidateString.class);
            SunpyValidateMax sunpyValidateMax = field.getAnnotation(SunpyValidateMax.class);
            SunpyValidateMin sunpyValidateMin = field.getAnnotation(SunpyValidateMin.class);
            // 判断该字段是否为字符串
            if (sunpyValidateString != null && field.getType().equals(String.class)) {
                if (field.get(t) == null || ((String)field.get(t)).length() <= 0) {
                    System.out.println(field.getName() + "不可以为空!");
                    return false;
                }
            }
            
            if ((sunpyValidateMax != null || sunpyValidateMin != null)
                    && field.getType().equals(Integer.class)
                    && field.get(t) == null) {
                System.out.println(field.getName() + "字段不可以为空!");
                return false;
            }
            
            // 判断该字段是否为Integer或者int类型
            if (field.getType().equals(Integer.class)
                    || field.getType() == int.class) {
                if (sunpyValidateMax != null && ((int) field.get(t)) > sunpyValidateMax.max()) {
                    System.out.println(field.getName() + "字段大于了最大值!");
                    return false;
                }
                
                if (sunpyValidateMin != null && ((int) field.get(t)) < sunpyValidateMin.min()) {
                    System.out.println(field.getName() + "字段小于了最小值!");
                    return false;
                }
            }
        }
        
        return true;
    }
}

测试:

public class MyTest {

    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setUsername("sunpy");
        user.setAge(150);
        System.out.println(ValidatorResolver.validate(user));
    }
}

结果:

age字段大于了最大值!
false

相关文章

  • Java注解知识梳理—自定义注解处理器

    Java注解知识梳理—自定义注解处理器 前言 前面介绍了如何自定义注解以及Java中关于注解的一些元素作用,学会了...

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • springMVC的自定义annotation(@Retenti

    自定义注解: 使用@interface自定义注解时,自动继承了java.lang.annotation.Annot...

  • 画个图,玩一下注解

    参考《深入理解Java:注解(Annotation)自定义注解入门》

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

  • Spring注解原理探索(一)

    之 Java元注解释义 Question 注解在Java中如何起作用? Spring是如何识别注解? 如何自定义注...

  • Java注解与Spring注解

    1,元注解与自定义注解 1)java.lang.annotation包中包含了所有定义自定义注解所需要的元注解和接...

  • JAVA之自定义注解

    java的基本注解和元注解,不满足条件时可以自定义注解。声明自定义注解使用@interface关键字实现。 根据注...

  • Android 编译时注解 —— 语法详解

    java Type 详解 java 反射机制详解 注解使用入门(一) Android 自定义编译时注解1 - 简单...

网友评论

      本文标题:Java 自定义注解

      本文链接:https://www.haomeiwen.com/subject/zqbbqqtx.html