欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

注解的那 劳务派遣管理系统 点事儿

点击: 次  来源:宝鼎软件 时间:2017-10-26

原文出处: SylvanasSun

什么是注解?

注解是JDK1.5引入的一个语法糖,它主要用来看成元数据,简朴的说就是用于表明数据的数据。在Java中,类、要领、变量、参数、包都可以被注解。许多开源框架都利用了注解,譬喻Spring、MyBatis、Junit。我们泛泛最常见的注解大概就是@Override了,该注解用来标识一个重写的函数。

注解的浸染:

  • 设置文件:替代xml等文本文件名目标设置文件。利用注解作为设置文件可以在代码中实现动态设置,对比外部设置文件,注解的方法会淘汰许多文本量。但缺点也很明明,变动设置需要对代码举办从头编译,无法像外部设置文件一样举办会合打点(所以此刻根基都是外部设置文件+注解殽杂利用)。
  • 数据的标志:注解可以作为一个标志(譬喻:被@Override标志的要领代表被重写的要领)。
  • 淘汰反复代码:注解可以淘汰反复且乏味的代码。好比我们界说一个@ValidateInt,然后通过反射来得到类中所有成员变量,只要是含有@ValidateInt注解的成员变量,我们就可以对其举办数据的法则校验。
  • 界说一个注解很是简朴,只需要遵循以下的语礼貌则:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    @Documented
    public @interface ValidateInt {
        // 它们看起来像是界说一个函数,但其实这是注解中的属性
        int maxLength();
    
        int minLength();
    
    }

    我们发明上面的代码在界说注解时也利用了注解,这些注解被称为元注解。浸染于注解上的注解称为元注解(元注解其实就是注解的元数据),Java中一共有以下元注解。

    @Target:用于描写注解的利用范畴(注解可以用在什么处所)。

  • ElementType.CONSTRUCTOR:结构器。
  • ElementType.FIELD:成员变量。
  • ElementType.LOCAL_VARIABLE:局部变量。
  • ElementType.PACKAGE:包。
  • ElementType.PARAMETER:参数。
  • ElementType.METHOD:要领。
  • ElementType.TYPE:类、接口(包罗注解范例) 或enum声明。
  • @Retention:注解的生命周期,用于暗示该注解会在什么时期保存。

  • RetentionPolicy.RUNTIME:运行时保存,这样就可以通过反射得到了。
  • RetentionPolicy.CLASS:在class文件中保存。
  • RetentionPolicy.SOURCE:在源文件中保存。
  • @Documented:暗示该注解会被作为被标注的措施成员的民众API,软件开发,软件开发,因此可以被譬喻javadoc此类的东西文档化。

    @Inherited:暗示该注解是可被担任的(假如一个利用了@Inherited修饰的annotation范例被用于一个class,则这个annotation将被用于该class的子类)。

    相识了这些基本常识之后,接着完成上述界说的@ValidateInt,我们界说一个Cat类然后在它的成员变量中利用@ValidateInt,并通过反射举办数据校验。

    public class Cat {
    
        private String name;
    
        @ValidateInt(minLength = 0, maxLength = 10)
        private int age;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public static void main(String[] args) throws IllegalAccessException {
            Cat cat = new Cat();
            cat.setName("楼楼");
            cat.setAge(11);
    
            Class<? extends Cat> clazz = cat.getClass();
            Field[] fields = clazz.getDeclaredFields();
            if (fields != null) {
                for (Field field : fields) {
                    ValidateInt annotation = field.getDeclaredAnnotation(ValidateInt.class);
                    if (annotation != null) {
                        field.setAccessible(true);
                        int value = field.getInt(cat);
                        if (value < annotation.minLength()) {
                            // ....
                        } else if (value > annotation.maxLength()) {
                            // ....
                        }
                    }
                }
            }
        }
    
    }

    注解的实现

    注解其实只是Java的一颗语法糖(语法糖是一种利便措施员利用的语礼貌则,但它其实并没有外貌上那么神奇的成果,只不外是由编译器帮措施员生成那些繁琐的代码)。在Java中这样的语法糖尚有许多,譬喻enum、泛型、forEach等。

    通过阅读JLS(Java Language Specification(当你想相识一个语言特性的实现时,最好的要领就是阅读官方类型)发明,注解是一个担任自java.lang.annotation.Annotation接口的非凡接口,原文如下:

    An annotation type declaration specifies a new annotation type, a special kind of interface type. To distinguish an annotation type declaration from a normal interface declaration, the keyword interface is preceded by an at-sign (@).
    
    Note that the at-sign (@) and the keyword interface are distinct tokens. It is possible to separate them with whitespace, but this is discouraged as a matter of style.
    
    The rules for annotation modifiers on an annotation type declaration are specified in §9.7.4 and §9.7.5.
    
    The Identifier in an annotation type declaration specifies the name of the annotation type.
    
    It is a compile-time error if an annotation type has the same simple name as any of its enclosing classes or interfaces.
    
    The direct superinterface of every annotation type is java.lang.annotation.Annotation.
    package java.lang.annotation;
    
    /**
     * The common interface extended by all annotation types.  Note that an
     * interface that manually extends this one does <i>not</i> define
     * an annotation type.  Also note that this interface does not itself
     * define an annotation type.
     *
     * More information about annotation types can be found in section 9.6 of
     * <cite>The Java™ Language Specification</cite>.
     *
     * The {@link java.lang.reflect.AnnotatedElement} interface discusses
     * compatibility concerns when evolving an annotation type from being
     * non-repeatable to being repeatable.
     *
     * @author  Josh Bloch
     * @since   1.5
     */
    public interface Annotation {
        ...
    }