您的位置:首页 > 职场人生

黑马程序员_注解(Annotation)

2012-02-11 11:03 375 查看
----------------------
android培训、java培训、期待与您交流! ---------------------

今天谈一谈jdk1.5中出现的比较重要的新特性:注解(Annotation),未来的开发模式都是基于注解的,现在的EJB,Spring,以及Struts2中部分的都是基于注解的。因此注解的使用是一种趋势。

Java为我们提供了几个基本的注解:@SuppressWarnings,@Deprecated,@Override。下面分别介绍一下三个注解。

1.@SuppressWarnings,它的功能是让编译器忽略警告,譬如@SuppressWarnings(“deprecation”),这句代码放在程序之前目的是让编译器忽略过时警告,示例代码如下:

@SuppressWarnings("deprecation")//加上这个注解告诉编译器,不管是不是过时的方法,都调用
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);

}

2.@Deprcated,这个标记表示定义的这个方法已经过时了,提醒编程人员尽量不要使用这个方法,避免带来不必要的麻烦。示例代码如下:

@Deprecated//声明方法过时了
public static void sayHello(){
System.out.println("hi,chuanzhiboke");
}

3.@Override,表示覆写父类的方法,示例代码如下:

@Override
public inthashCode() {
final int prime = 31;
int result = 1;
result= prime * result + x;
result= prime * result + y;
return result;
}
@Override
public booleanequals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() !=obj.getClass())
return false;
ReflectPointother = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}

总之,注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,以后javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无标记,根据标记区执行相应的动作。注解可以加在包,类,字段,方法,方法的参数以及局部变量上。

注解就相当于你的源程序要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。现在我们来谈谈如何自定义一个注解类及其应用。

定义一个最简单的注解:

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD,ElementType.TYPE})

import java.lang.annotation.*;

public @interface ItcastAnnotation{}

其定义模式类似于定义接口,只不过在interface之前添加@,当然还要导入lang包里面的annotation包。

然后把这个注解加在一个类之前,然后用反射的方式测试这个注解是否存在于类中,示例代码如下:

//如果ItcastAnnotation没有加上@Retention(RentionPolicy.RUNTIME),则默认注解出现在class文件中,到字节码文件中,ItcastAnnotation注解则消失了
//而AnnotationTest.class.isAnnotationPresent()对应的是字节码中的文件,则返回值为空,所以if()的返回值为false
if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
ItcastAnnotation annotation=(ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class);
System.out.println(annotation);
System.out.println(annotation.color());
System.out.println(annotation.value());
System.out.println(annotation.arrayAttr().length);
System.out.println(annotation.lamp().nextLamp().name());
System.out.println(annotation.ma().value());
System.out.println(annotation.clazz().getClass());
}

从上面又引出了元注解的概念,元注解顾名思义是注解的注解,首先@Retention注解有三种取值,分别是@Retention(RetentionPolicy.SOURCE),@Retention(RetentionPolicy.CLASS)和@Retention(RetentionPolicy.RUNTIME)对应的阶段:java 源文件,class文件,内存中的字节码。而@Retention的默认值是@Retention(RetentionPolicy.CLASS)。

还有@Target元注解,@Target 的默认值是任何元素,它的取值可以是ElementType.METHOD,ElementType.TYPE等,表示该注解可以加在方法,类,接口等元素的前面。

当然也可以为注解增加基本属性和高级属性,基本属性中可以指定属性的缺省值(default),还有一个Value()比较特殊,当其他属性都采用默认值或者该注解只含有value属性,那么可以省略“value=”部分,例如:@MyAnnotation(“IBM”)

示例代码如下:

import java.lang.annotation.*;

import cn.itcast.day1.EnumTest;

@Retention(RetentionPolicy.RUNTIME)
//元注解,就是注解的注解
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
String color();
String value() default "flx";
int[]arrayAttr();
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotationma() default @MetaAnnotation("yyy");
Class clazz() default String.class;

}

从上述代码可以看出,我们可以为注解添加高级属性,譬如数组,枚举,Class类型,注解类型的属性,当然通过查阅java的语言规范我们可以知道,还可以为注解添加八个基本类型的属性。

----------------------
android培训、java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: