注解

2017-04-17  本文已影响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)的注解,那么说明该注解在程序运行期间都会存在内存当中。此时,我们可以通过反射来获得定义在某个类上的所有注解。

上一篇下一篇

猜你喜欢

热点阅读