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