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