黑马程序员---Java基础加强---JDK1.5新特性:注解

-------  android培训 java培训 、期待与您交流! ----------

JDK1.5新特性:注解

一、了解和入门注解的应用

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

1.注解的种类
@SupressWarnings:压缩警告,,默认在源文件阶段

@Deprecated:表示方法为过时或者作废,但是仍可以用,只是再用的时候尽量不要用此方法。此注解默认在运行阶段。

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

2.注解相当于一种标记

在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其

他的程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干相应的事。

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

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


二、注解的定义与反射调用

注解是JDK1.5的新特性。

1.需求:

写一个注解类,并将此注解类应用于一个类上,并在别的类通过反射来获取此类上的注解类名称。

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

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

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

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

程序如下:

@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);
	}
}

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})即里面的值

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

3.为注解增加各种属性

(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();

例子:

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";
		
	}
} 
//定义一个注解
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");
}

//定义一个注解
public @interface AnnoAnnotation
{
	String value();
}



你可能感兴趣的:(java基础加强)