了解和入门注解的应用


注解相当于是一个特殊的类

1、注解的种类

@SupressWarnings :压缩警告,,默认在源文件阶段

@Deprecated      :表示方法为过时或者作废,但是仍可以用,只是再用的时候尽量不要

用此方法。此注解默认在运行阶段。

@Override       :表示此方法是复写的父类的方法。此注解默认在源文件阶段。

2、注解相当于一种标记在程序中加了注解就等于为程序打上了某种标记,没加,则

等于没有某种标记,以后,javac编译器,开发工具和其他的程序可以用反射来了解

你的类及各种元素上有无何种标记,看你有什么标记就去干相应的事。

3、标记可以加在包,类,字段(成员变量),方法,方法的参数以及局部变量上。

4、总结:注解即是向编译器、开发工具或者其他的程序传达一种信息。

--------------------------------------------------------------------------------------

注解的定义与反射调用

注解是JDK1.5的新特性。

1、需求:写一个注解类,并将此注解类应用于一个类上,并在别的类通过反射来获取此类上

的注解类名称。

  分析:要想得到某一个类的注解,

第一:首先通过反射看此类上面是否有此注解,此类字节码.isAnnotationPresent(此类字节码)

第二:通过反射来获取此注解对象,此类自己码.getAnnotation(此类字节码)

第三:由于你只是获取了注解对象,但是并不知道是什么类型的注解,所以前面要有类型转换。


程序如下:

package cn.itcast.day2;
@ItcastAnnocation
public class AnnotationTest {
	public static void main(String[] args)throws Exception {
		// TODO Auto-generated method stub
		//判断这样的一个类中是否存在注解ItcastAnnocation
		if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class))
			ItcastAnnotation annotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
		System.out.println(annotation);
	}
}
package cn.itcast.day2;
import java.lang.annotation.RetentionPolicy;
@Target(ElementType.TYPE)//表示此注解只可以用于类
@Retention(RetentionPolicy.RUNTIME)//表示此注解保留在运行阶段
public @interface ItcastAnnotation {
}


2、元注解

定义:注解的注解即为元注解。例如,上面的程序中的@Target(ElementType.TYPE)

和@Retention(RetentionPolicy.RUNTIME),这是两种元注解

元注解@Retention(取值),表示注解可以保留在什么阶段,他的取值是一个枚举类型

取值可以有RetentionPolicy.RUNTIME,RetentionPolicy.CLASS,RetentionPolicy.SOURCE

分别对应于:运行阶段,类文件阶段,还有源程序阶段。

即表示,注解的存在有三个阶段:源文件阶段->类文件阶段->运行阶段

默认的阶段是在源文件阶段。即一编译完成,其注解就不在文件中显示了,即类文件中没有相关的信息。

而类文件阶段表示,编译完成之后,注解还在,在类文件中有相关信息;而运行阶段,即表示注解存在于

类的二进制的字节码中。

元注解:@Target(取值),表示注解可以使用的范围,他的取值也是一个枚举类型

取值可以为:ElementType.PACKAGE,ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,

ElementType.CONSTRUCTOR,ElementType.LOCAL VARIABLE,ElementType.PARAMETER

对应于:注解可以用于包、类或者接口、方法、成员变量、构造函数、局部变量、参数上;

若是即用于的是类又可以用于方法中,则写成@Target({ElementType.TYPE,ElementType.METHOD})

即里面的值是数组的形式,当只有一个值时可以不用写{},若是两个以上,则必须写{}。


--------------------------------------------------------------------------------------



为注解增加各种属性


1、属性的返回值可以是:8种基本数据类型(byte,short,char,int,long,boolean,float,double),String,数组


Class,注解型,枚举型。


2、给注解的属性值进行设值有两种方式:


第一,在创建注解对象的时候设置值,即@ItcastAnnotation(属性名="abc")


第二,在注解类中定义属性时直接给出默认值,即String value()default "abc";


注意,虽然在定义注解类的属性时,已经给出了此属性的值,但可以通过创建对象来重新设置值,


也可以不用再设置值。


3、注解类中特殊的属性


当属性名是value且只有这一个属性时,则在对象上设置值时,可以不用写此属性名和等号,直接写值


如:注解类中的属性定义为String value()default "abc";


而对象上可以写成@ItcastAnnotation("abc")


4、注解类的属性的使用和设置值


对于注解类的属性在进行设置值时,以属性的形式设置值,即:属性名=值  的形式


而对取出此属性的值时(即使用此属性时),依然用调用的形式,即:注解类对象.value();


例子:


package cn.itcast.day2;
import java.util.*;
@ItcastAnnocation(value="bcd",getAge=9,enumAnnotationArray=EnumTest.TUS)
//由于属性getAge还没赋值,所以对于value赋值时必须写上value=
//由于属性enumAnnotationArray的取值是一个,所以可以不用写{},两个以上就必须写上{}
class AnnotationApply                  
{
}
//此类功能为操作运用了注解的类。									 
class AnnotationTest1 
{
	public static void main(String[] args) throws Exception
	{
		//运用翻书看类中是否运用了注解并且取出此注解中属性的值
		if (AnnotationApply.class.isAnnotationPresent(ItcastAnnocation.class))
		{
			//如果有此注解,则获取此注解
			ItcastAnnocation annotation=(ItcastAnnocation)AnnotationApply.class.getAnnotation(ItcastAnnocation.class);
			//System.out.println(annotation);
			//对此注解对象进行操作,要获取它的各个属性值
			System.out.println(annotation.value());
			System.out.println(annotation.getAge());
			//将数组转化为字符串打印出来
			System.out.println(Arrays.toString(annotation.arr()));
			System.out.println(annotation.classAnnotation().getName());
			//System.out.println(annotation.enumAnnotation().toString());
			//将数组转化为集合打印出来
			//System.out.println(Arrays.asList(annotation.enumAnnotationArray()));
			System.out.println(annotation.aannotation().value());
		}
	}
}
//定义一个枚举类
enum EnumTest
{
	SUN,MON,TUS,WEN,THUD,FRI,SAT;
	public String toString(){
		return "SUN";
		
	}
} 
//定义一个注解
package cn.itcast.day2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)//使此注解保持到运行阶段
public @interface ItcastAnnocation
{
	//给此属性设置属性
	//1、属性的返回值是String
	String value()default "abc";
	//返回值类型为int型
	int getAge();
	//返回值类型为数组型
	int[] arr() default {1,2,3};
	//返回值类型为Class类型
	Class classAnnotation() default String.class;
	//返回值类型为枚举型
	EnumTest enumAnnotation() default EnumTest.SUN;
	//或者是返回值类型为枚举型的数组
	EnumTest[] enumAnnotationArray() default {EnumTest.SUN,EnumTest.MON};
	//返回值类型为注解型
	AnnoAnnotation aannotation() default @AnnoAnnotation("abc");
}
//定义一个注解
package cn.itcast.day2;
public @interface AnnoAnnotation
{
	String value();
}