黑马程序员技术交流社区

标题: 注解有什么实际用途? [打印本页]

作者: 王春晓    时间: 2013-5-19 15:34
标题: 注解有什么实际用途?
本帖最后由 王春晓 于 2013-5-19 18:36 编辑
  1. <p>import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;</p><p>import cn.itcast.day1.EnumTest;</p><p>
  5. @Retention(RetentionPolicy.RUNTIME)//元注解-->保留注解至运行时期
  6. @Target({ElementType.METHOD,ElementType.TYPE})
  7. public @interface ItcastAnnotation {
  8. String color() default "bule";//指定一个缺省值
  9. String value();
  10. int[] arrayAttr() default {3,4,5};
  11. EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
  12. MetaAnnotation annotationAttr() default @MetaAnnotation("mmm");
  13. Class a() default String.class;
  14. }

  15. @ItcastAnnotation(color = "red",value = "abc",arrayAttr = {1,2,3},annotationAttr=@MetaAnnotation("flx"))//只要一个值的话可以不写color= value=
  16. public class AnnutationTest {
  17. @SuppressWarnings("deprecation")
  18. @ItcastAnnotation("xyz")
  19. public static void main(String[] args){
  20.   System.runFinalizersOnExit(true);
  21.   if(AnnutationTest.class.isAnnotationPresent(ItcastAnnotation.class)){
  22.    ItcastAnnotation annutation = (ItcastAnnotation)AnnutationTest.class.getAnnotation(ItcastAnnotation.class);
  23.    System.out.println(annutation.color());
  24.    System.out.println(annutation.value());
  25.    System.out.println(annutation.arrayAttr().length);
  26.    System.out.println(annutation.lamp().nextLamp().name());
  27.    System.out.println(annutation.annotationAttr().value());
  28.    System.out.println(annutation.a());
  29.   }
  30. }
  31. @Deprecated
  32. public static void sayHello(){
  33.   System.out.println("hello");
  34. }
  35. }
  36. </p><div class="quote"><blockquote>张孝祥老师的高新技术里面讲解了注解的用法,但是讲了这么多用法,什么时候才应该用到注解呢?
复制代码

作者: 神之梦    时间: 2013-5-19 16:29
等大神吧
作者: 8047107    时间: 2013-5-19 17:03
妈呀 我瞎了~
作者: Sword    时间: 2013-5-19 17:06
本帖最后由 Sword 于 2013-5-19 17:08 编辑

这是以前整理的,偷点懒直接粘贴过来的,希望对你有帮助
一、概述:
1、注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则没有某种标记。
2、以后,java编译器、开发工具和其他应用程序就可以用反射来了解自己的类及各种元素上有无何种标记,有什么标记,就会做出相应的处理。
3、标记可以加在包、类、字段、方法、方法参数,以及局部变量上等等。
4、在java.lang包中提供了最基本的annotation,即注解。
5、格式:@注解类名()。如果有属性,则在括号中加上属性名(可省略)和属性值。
二、java中三种最基本的注解:
1、@SuppressWarning(”deprecation”)--->压制警告
SupressWarning是告知编译器或开发工具等提示指定的编译器警告;
”deprecation”是告知具体的信息即方法已过时。
通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation")
2、@Deprecated--->提示成员等已经过时,不再推荐使用。
源代码标记@Deprecated是在JDK1.5中作为内置的annotation引入的,用于表明类(class)、方法(method)、字段(field)已经不再推荐使用,并且在以后的JDK版本中可能将其删除,编译器在默认情况下检测到有此标记的时候会提示警告信息。
直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。
例如:假定之前的某个类升级了,其中的某个方法已经过时了,不能够将过时的方法删除,因为可能会影响到调用此类的这个方法的某些程序,这是就可以通过在方法上加这个注解。
3、@Override--->提示覆盖(父类方法)
加上此注解,,可对自己类中的方法判断是否是要覆盖的父类的方法,典型的例子即在集合中覆盖equals(Object obj)方法,其中的参数类型必须是Object,才能被覆盖,若不是,加上此注解就会提示警告。
例如:public boolean equals(Reflect other)方法与HashSet结合
三、注释的应用--->注解类:
1、定义格式:@interface 名称{statement}
2、元注解(注解的注解)
一个注解有其生命周期(Retetion)和存放的位置(Taget),这就可以通过元注解说明。
四、自定义注解及其应用
1)定义一个最简单的注解:public @interface MyAnnotation {}
2)把它加在某个类上:@MyAnnotation public class AnnotationTest{}
3)用反射进行测试AnnotationTest的定义上是否有@MyAnnotation
4)根据发射测试的问题,引出@Retention元注解的讲解,其三种取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。
5)@Target元注解
Target的默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错了,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE}就可以了。
元注解以及其枚举属性值不用记,只要会看jdk提供那几个基本注解的API帮助文档的定义或其源代码,按图索骥即可查到,或者直接看java.lang.annotation包下面的类。
注解的应用结构图:

20130429235605957.png (19.15 KB, 下载次数: 0)

20130429235605957.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2