• 注解的定义和使用


    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()+"参数范围错误");
                    }
    
                }
    
            }
        }
    }
    
    

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

  • 相关阅读:
    【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
    【刷题】BZOJ 4650 [Noi2016]优秀的拆分
    【刷题】BZOJ 4566 [Haoi2016]找相同字符
    【刷题】BZOJ 3238 [Ahoi2013]差异
    微信公众号_订阅号_被动回复用户消息
    艺术模板 art-template-web
    AJAX_违反了同源策略_就是"跨域"——jsonp 和 cors
    Ajax_简介: 异步的 JS 和 XML_原生写 ajax 分析其原理_jquery_ajax_art-template
    Node.js_express_临时会话对象 session
    BOM 浏览器对象模型_XMLHttpRequest 对象
  • 原文地址:https://www.cnblogs.com/hellosiyu/p/13256273.html
Copyright © 2020-2023  润新知