注解

作者: 小颖啊 | 来源:发表于2017-04-17 18:12 被阅读0次

    what

    1.注解:Java中的元数据
    元数据?:描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据。eg:.xml配置文件
    2.注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,里面的属性就是键值对。程序可以利用java的反射机制来了解类及各种元素上有无何种标记,针对不同的标记,就去做相应的事件。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。JDK定义成@interface
    3.java的注解本质上是一个接口,而且是继承了接口Annotation的接口,见JDK文档

    /**
     * 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 {
    }
    

    why

    本质注解和.xml文件实现效果是一致的:

    .xml:集中式的元数据,与源代码无绑定
    @interface(注解):分散式的元数据,与源代码紧绑定

    如何选择?

    1.约定大于一切
    2.用配置还是走XML吧,比如事务配置,比如数据库连接池等等
    3.注解缺乏灵活性,在实现复杂的逻辑上,没有XML来的更加强大;注解就是要么用,要么不用,不可用功能的一部分
    4.注解简单,但是不容易理解
    ...

    how

    xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <SCHOOL>
        <name>蓝胖子</name>
        <address>日本东京</address>
        <food name="banana">
            <num>2<num>
        </food>
        <food name="apple">
            <num>3</num>
        </food>
    </SCHOOL>
    

    注解:

    package com.test.zy.xml;
    
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
     
    public class Student {
         
        private String studentNum;
        private String studentName;
        private String studentGrade;
        private int age;
         
        @XmlElement(name="num")
        public String getStudentNum() {
            return studentNum;
        }
        public void setStudentNum(String studentNum) {
            this.studentNum = studentNum;
        }
        @XmlElement(name="name")
        public String getStudentName() {
            return studentName;
        }
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
        @XmlAttribute(name="grade")
        public String getStudentGrade() {
            return studentGrade;
        }
        public void setStudentGrade(String studentGrade) {
            this.studentGrade = studentGrade;
        }
        @XmlElement
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
         
        @Override
        public String toString() {
            return "Student [studentNum=" + studentNum + ", studentName="
                    + studentName + ", studentGrade=" + studentGrade + ", age="
                    + age + "]";
        }
         
         
     
    }
    

    注解生命周期

    一个注解可以有三个生命周期,它默认的生命周期是保留在一个CLASS文件,
      但它也可以由一个@Retetion的元注解指定它的生命周期。
      a.java源文件
        当在一个注解类前定义了一个@Retetion(RetentionPolicy.SOURCE)的注解,那么说明该注解只保留在一个源文件当中,当编译器将源文件编译成class文件时,它不会将源文件中定义的注解保留在class文件中。
       b. class文件中
       当在一个注解类前定义了一个@Retetion(RetentionPolicy.CLASS)的注解,那么说明该注解只保留在一个class文件当中,当加载class文件到内存时,虚拟机会将注解去掉,从而在程序中不能访问。
      c. 程序运行期间
       当在一个注解类前定义了一个@Retetion(RetentionPolicy.RUNTIME)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。

    相关文章

      网友评论

          本文标题:注解

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