最近看到不少项目都是用了自定义注解,例如java
1.什么是注解?数据库
元数据(metadata),就是指数据的数据,元数据是描述数据的,就像数据库中的,表的字段,每个数组
字段描述这个字段下面·的数据的含义,j2Se5.0中提供的注释就是java源代码的源数据,注释就是描述ide
java源代码的。使用@后面跟注解工具
简单一点:开发工具
一个注解是一个类spa
注解至关于一种标记,在程序中加上了注解就等于为程序加上了某种标记,之后,
JAVAC编译器,开发工具和其余程序能够用反射来了解你的类以及各类元素上有无任何标记,看你有什么标记,就去干相应的事。3d
注解@Override用在方法上,当咱们想重写一个方法时,在方法上加@Override,当咱们方法
的名字出错时,编译器就会报错,如图:blog
注解@SuppressWarnings用来压制程序中出来的警告,好比在没有用泛型或是方法已通过时的时候,继承
2.J2SE5.0中预约义的注释
在J2SE5.0的java.lang包中预约义了三个注释。它们是Override、Deprecated和SuppressWarnings。下面分别解释它们的含义。
1.Override注释:仅用于方法(不可用于类、包的生命或其余),指明注释的方法将覆盖超类中的方法(若是覆盖父类的方法而没有注
释就没法编译该类),注释还能确保注释父类方法的拼写是正确(错误的编写,编译器不认为是子类的新方法,而会报错)
2.@Deprecated注释:对不该再使用的方法进行注释,与正在声明为过期的方法放在同一行。使用被 Deprecated注释的方法,编译器会
提示方法过期警告(”Warring”)
3.@SuppressWarnings注释:单一注释,能够经过数组提供变量,变量值指明要阻止的特定类型警告(忽略某些警告)。数组中的变量指明要阻止的警告 @SuppressWarnings(value={”unchecked”,”fallthrough”}))
这个作了解就能够了
3.java中的自定义注解 (@interface)
它相似于新建立一个接口类文件,但为了区分,咱们须要将它声明为@interface
@interface:注释声明,定义注释类型(与默认的Override等三种注释类型相似)。请看下面实例:
4.@Target做用
指定程序元定义的注解所使用的地方,它使用了另外一个类:ElementType,是一个枚举类定义了注释类型能够应用到不一样的程序元素以避免使用者误用
TYPE, // 指定适用点为 class, interface, enum
FIELD, // 指定适用点为 field
METHOD, // 指定适用点为 method
PARAMETER, // 指定适用点为 method 的 parameter
CONSTRUCTOR, // 指定适用点为 constructor
LOCAL_VARIABLE, // 指定使用点为 局部变量
ANNOTATION_TYPE, //指定适用点为 annotation 类型
PACKAGE // 指定适用点为 package
5.@Retention做用
这个元注释和java编译器处理注释的注释类型方式相关,告诉编译器在处理自定义注释类型的几种不一样的选择,须要使用RetentionPolicy枚举类。此枚举类只有一个 成员变量,能够不用指明成名名称而赋值
类中有个RetentionPolicy类,也是一个枚举类,具体看代码:
public enum RetentionPolicy {
SOURCE, // 编译器处理完Annotation后不存储在class中
CLASS, // 编译器把Annotation存储在class中,这是默认值
RUNTIME // 编译器把Annotation存储在class中,能够由虚拟机读取,反射须要
}
6.@Documented
是一个标记注释,表示注释应该出如今类的javadoc中,由于在默认状况下注释时不包括在javadoc中的。
因此若是花费了大量的时间定义一个注释类型,并想描述注释类型的做用,可使用它。
注意他与@Retention(RetentionPolicy.RUNTIME)配合使用,由于只有将注释保留在编译后的类文件中由虚拟机加载,
而后javadoc才能将其抽取出来添加至javadoc中。
7. @Inherited
若是一个方法使用了的注释用了@inherited,
那么其子类的该方法一样继承了该注释
8.小例子
package zhujei2;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person{
String name();
int age();
}
package zhujei2;
@Person(name="我爱你",age=250)
public class test2 {
public static void print(Class c){
System.out.println(c.getName());
//java.lang.Class的getAnnotation方法,若是有注解,则返回注解。不然返回null
Person person = (Person)c.getAnnotation(Person.class);
if(person != null){
System.out.println("name:"+person.name()+" age:"+person.age());
}else{
System.out.println("person unknown!");
}
}
public static void main(String[] args){
test2.print(test2.class);
}
}