zoukankan      html  css  js  c++  java
  • 注解的定义和使用

    1 判断某个注解是否存在

    判断某个注解是否存在于Class、Field、Method或Constructor:

    Class.isAnnotationPresent(Class)
    Field.isAnnotationPresent(Class)
    Method.isAnnotationPresent(Class)
    Constructor.isAnnotationPresent(Class)
    

    例如:判断Person类是否存在注解@Report
    Person.class.isAnnotationPresent(Report.class)

    2 使用反射API读取注解

    Class.getAnnotation(Class)
    Field.getAnnotation(Class)
    Method.getAnnotation(Class)
    Constructor.getAnnotation(Class)
    

    3 定义一个注解

    /**
     * 定义一个注解,希望字符串的长度在0-255
     */
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface StringRange {
        int min() default 0;
        int max() default 255;
    }
    

    这个注解用在字段上,生命周期在运行期,默认的长度在0-255之间

    4 定义一个Java实体类

    package com.taobao;
    
    public class Person {
        @StringRange(max=2)
        public String name;
    
        @StringRange(max=100)
        public String hobby;
    
        @StringRange
        public String address;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getHobby() {
            return hobby;
        }
    
        public void setHobby(String hobby) {
            this.hobby = hobby;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
    

    5 检查是否符合注解要求

    public class Check {
        public static void main(String[] args) throws IllegalAccessException {
            Person person = new Person();
            person.setAddress("中国北京");
            person.setHobby("怕啊啪啪");
            person.setName("nezha");
            check(person);
    
        }
    
        /**
         * 查看Person实例是否符合注解要求
         * @return
         */
        public static void  check(Person person) throws IllegalAccessException {
            Field[] fields = person.getClass().getFields();
            for (Field field : fields) {
                StringRange annotation = field.getAnnotation(StringRange.class);
                if (annotation!=null){
                    int min = annotation.min();
                    int max = annotation.max();
                    // 通过反射拿到字段的值
                    String str = (String)field.get(person);
                    if (str.length()<min || str.length()>max){
                        throw new IllegalArgumentException(field.getName()+"参数范围错误");
                    }
    
                }
    
            }
        }
    }
    
    

    可以通过反射拿到字段,拿到方法,拿到类,拿到构造器,然后再拿到注解,再拿到注解中的值,在应用在程序中。

  • 相关阅读:
    2031 HDOJ 进制转换
    计算机视觉实验之直方图均衡化和对数变换
    sublime text3创建文件时生成头部注释
    浏览器调试出错
    css世界-读书笔记
    redis中Bitmaps位图应用场景
    redis中hyperloglog基数统计
    redis中Zset有序集合类型常用命令
    redis中set集合类型常用命令
    redis中hash哈希类型常用命令
  • 原文地址:https://www.cnblogs.com/hellosiyu/p/13256273.html
Copyright © 2011-2022 走看看