1、 注解(Annotation)的概念:注解就等于为程序打上了某种标记,以后,javac编译器、开发工具和其它程序可以用反射来了解你的类及各种元素上有无何种标记,注解可以加在包上、字段、方法、方法的参数以及局部变量上。
2、注解的定义,使用@Interface关键字进行定义
@Interface textAnnotation
{ }
3.java中三个基本的注解:
(1)、 @Override
@Override就是用来指定方法覆盖的,它可以强制一个子类必须覆盖父类的方法,@Override Annotation只能用于作用于方法,不能用于作用于其它程序元素
(2)、 @Deprecated
@Deprecated用来标记已过时元素的
(3)、@SuppressWarings
@SupperssWarings用来指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。
4、注解的三个状态
@Retention Annoation 指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为RetentionPolicy.CLASS。
@Retention Annoation 注解有的三个值
RetentionPolicy.CLASS 注解的默认值,表示编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
RetentionPolicy.RUNTIME 表示编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
RetentionPolicy.SOURSE 表示编译器要丢弃的注释。 仅在原文件中。编译后就没有记录了。
5.注解的使用范围
@Target() 指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
例如,@Target(Annotation_TYPE))此元注释指示该声明类型是其自身,即元注释类型。它只能用在注释类型声明上:
6.注解可添加的其它组成组分
@Retention(RetentionPolicy.RUNTIME)//Retention:停留,滞留
@Target({ElementType.TYPE ,ElementType.METHOD})//这个注解的范围为类和方法上
定义的一个注解
public @interface TestAnnotation {
String color()default "red";//为注解添加的一个属性,可以给定一个默认值,这样在调用注解的时候可以不用再为这个属性赋值
int[] intAttr();//可以为注解添加数据
NewAnnotation atton() default @NewAnnotation("注解");//添加注解类型的属性
} 总结:注解中可以定义8 个基本数据类型的字段,还可以有基本类型的数组、枚举、以及注解类型的字段。
7、注解的调用:下面是一个用反射调用注解的例子
package itcast.annotationStu;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.annotation.Resource;
@Retention(RetentionPolicy.RUNTIME)//Retention:停留,滞留
@Target({ElementType.TYPE ,ElementType.METHOD})
//定义的一个注解
public @interface TestAnnotation {
String color()default "red";
int[] intAttr();
NewAnnotation atton() default @NewAnnotation("注解");
}
//注解的调用
package itcast.reflact;
import itcast.annotationStu.NewAnnotation;
import itcast.annotationStu.TestAnnotation;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
* java内省学习,读取javabean
*/
@TestAnnotation(color="green",intAttr={1},atton=@NewAnnotation("新的注解"))
@SuppressWarnings("deprecation")
public class CopyOfInstroSpectorStu {
/**
* @param args
* @throws IntrospectionException
*/
public static void main(String[] args) throws IntrospectionException {
testAnnoation();
}
//注解的调用
public static void testAnnoation()
{
//根据使用了注解的类的字节码反射来获得注解信息
TestAnnotation testAnno=CopyOfInstroSpectorStu.class.getAnnotation(TestAnnotation.class);
//获得注解的类型
System.out.println(testAnno.annotationType());
//注解的属性
System.out.println(testAnno.color());
//注解的属性
System.out.println(testAnno.atton().value());
//注解的数组属性
System.out.println(testAnno.intAttr()[0]);
Annotation [] as= testAnno.getClass().getAnnotations();
for (Annotation annotation : as) {
System.out.println("test");
System.out.println(annotation);
}
}
}