黑马程序员技术交流社区

标题: 关于注解的一个问题 [打印本页]

作者: 创造命运    时间: 2014-4-24 13:55
标题: 关于注解的一个问题
本帖最后由 创造命运 于 2014-4-25 07:52 编辑

学完张老师的注解视频,整理笔记时想到两点问题。注解的作用是什么?为什么要在注解类里添加各种属性?

在看视频时,只看到了三个基本的注解的功能:
1、@SuppressWarning(”deprecation”)--->压制警告
        SupressWarning是告知编译器或开发工具等提示指定的编译器警告;”deprecation”是告知具体的信息即方法已过时。
2、@Deprecated--->提示成员等已经过时,不再推荐使用。
        源代码标记@Deprecated是在JDK1.5中作为内置的annotation引入的,用于表明类(class)、方法(method)、字段(field)已经不再推荐使用,并且在以后的JDK版本中可能将其删除,编译器在默认情况下检测到有此标记的时候会提示警告信息。
3、@Override--->提示覆盖(父类方法)
        加上此注解,可对自己类中的方法判断是否是要覆盖的父类的方法,典型的例子即在集合中覆盖equals(Object obj)方法,其中的参数类型必须是Object,才能被覆盖,若不是,加上此注解就会提示警告。


但是这还不足以解释注解的作用是什么这个问题。于是在网上查了一下,有人做了如下回答:
1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
2、跟踪代码依赖性,实现替代配置文件功能。现在的框架基本都使用了这种配置来减少配置文件的数量。以后java的程序开发,最多的也将实现注解配置,具有很大用处;
3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。


看完视频,我们只知道可以给注解类添加各种属性,知道如何用反射的方法来获取注解类里面的属性值,可是却不知道为什么要这么做。那么为什么要在注解类里面添加各种属性呢?我们用反射的方法来获取注解类里面的各种属性值的目的是什么?我想肯定不仅仅是为了操作注解类里面的各种属性。哪位大神能帮我解答一下,感谢。

作者: 张稳    时间: 2014-4-24 16:13
就好像老师说的注解是一个学生挂了一个牌子,证明是本学校的,注解的属性就是牌子是什么颜色,用于区分你是哪个年级的,接下来介绍具体的应用。

大多数的时候,是定义自己的注解,并编写自己的处理器来出来他们。
比如一个举个例子:写一个简单的注解,我们可以用它来跟踪一个项目中的用例。如果一个方法或一组方法实现了某个用例的需求,那么加上注解后,就很容易知道项目进展到哪

  1. @target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNIME)
  3. public @interface UseCase{
  4. public int id();
  5. public String description default"no description"
  6. }
复制代码
  1. public class PasswordUtils{
  2. @UseCase(id=47, description="Passwords must contain at least one numeric")
  3. public boolean validatePassword(String password){
  4.   return (password.matches("\\w*\\d\\w*"));
  5. }
  6. @UseCase(id=48)
  7. public String encryptPassword(String password){
  8. return new StringBuilder(password).reverse().toString();
  9. }
  10. }
  11. }
复制代码

下面的程序是用来处理注解的,需要用到反射
  1. public class UseCaseTracker{
  2. public static void TrackUseCases(List<Integer> useCases, Class<?> cl){
  3.   for(Method m: c1.getDeclaredMethods()){
  4.     UseCase uc =m.getAnnotation(UseCase.calss);
  5. if(uc!=null){
  6.   System.out.println("Found Use Case :" + uc.id()+" "uc.description());
  7. useCases.remove(new Integer(uc.id()));
  8.     }
  9.    }
  10.    for(int i: useCases){
  11.   System.out.println("Warning : Missing use case-"+ i);
  12.    }
  13. }
  14. public static void main (String[] args){
  15.   List<Integer> useCases=new ArrayList<Integer>();
  16.   Collections.addAll(useCases, 47,48);
  17.    trackUseCases(useCases, PasswordUtils.class);
  18. }
  19. }
复制代码

作者: 创造命运    时间: 2014-4-24 19:28
张稳 发表于 2014-4-24 16:13
就好像老师说的注解是一个学生挂了一个牌子,证明是本学校的,注解的属性就是牌子是什么颜色,用于区分你是 ...

非常给力,明白一些了。谢谢!




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