元注解在正常使用过程当中并不常见,通常写框架的时候会用。下面简单复习一下注解:java
JAVA5.0以后定义了4个元注解:框架
@Retention
@Target
@Documented
@Inherited
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出如今源代码中,而被编译器丢弃;而另外一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另外一些在class被装载时将被读取。使用这个meta-Annotation能够对 Annotation的“生命周期”来进行限制。ide
做用:表示须要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)工具
取值(RetentionPoicy)有:this
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)spa
Retention meta-annotation类型有惟一的value做为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例以下:code
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { public String value() default "ColumnName";8 }
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。对象
做用:用于描述注解的使用范围(即:被描述的注解能够用在什么地方)blog
取值(ElementType)有:继承
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
使用:
@Target(ElementType.TYPE) public @interface Table { public String tableName() default "className"; } @Target(ElementType.FIELD) public @interface NoDBColumn { }
@Documented:
@Documented用于描述其它类型的annotation应该被做为被标注的程序成员的公共API,所以能够被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { public String name() default "fieldName"; public String setFuncName() default "setField"; public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }
@Inherited:
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。若是一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME。若是咱们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工做:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
实例代码:
@Inherited public @interface Greeting { public enum FontColor{ BULE,RED,GREEN}; String name(); FontColor fontColor() default FontColor.GREEN; }
有了上面的东西,就能够来实现一个自定义注解了,例如像下面这样:
1 package com.wc.annotation; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 @Retention(RetentionPolicy.RUNTIME) 9 @Target(ElementType.TYPE) 10 public @interface Entity { 11 String value(); 12 }
1 package com.wc.annotation; 2 3 import java.lang.annotation.ElementType; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 import java.lang.annotation.Target; 7 8 9 @Retention(RetentionPolicy.RUNTIME) 10 @Target(ElementType.FIELD) 11 public @interface Column { 15 String value(); 16 } 17
package com.wc.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Id { String value(); }
使用注解以下所示:
import java.util.Date; import com.wc.annotation.Column; import com.wc.annotation.Entity; import com.wc.annotation.Id; @Entity("books") public class Book { @Id("book_id") private Integer id; @Column("book_isbn") private String isbn; @Column("book_name") private String name; @Column("book_author") private String author; @Column("book_publisher") private String publisher; @Column("book_date") private Date date; @Column("book_price") private double price; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Book [id=" + id + ", isbn=" + isbn + ", name=" + name + ", author=" + author + ", publisher=" + publisher + ", date=" + date + ", price=" + price + "]"; } }