黑马程序员技术交流社区
标题:
关于注解的一个问题
[打印本页]
作者:
创造命运
时间:
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
就好像老师说的注解是一个学生挂了一个牌子,证明是本学校的,注解的属性就是牌子是什么颜色,用于区分你是哪个年级的,接下来介绍具体的应用。
大多数的时候,是定义自己的注解,并编写自己的处理器来出来他们。
比如一个举个例子:写一个简单的注解,我们可以用它来跟踪一个项目中的用例。如果一个方法或一组方法实现了某个用例的需求,那么加上注解后,就很容易知道项目进展到哪
@target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNIME)
public @interface UseCase{
public int id();
public String description default"no description"
}
复制代码
public class PasswordUtils{
@UseCase(id=47, description="Passwords must contain at least one numeric")
public boolean validatePassword(String password){
return (password.matches("\\w*\\d\\w*"));
}
@UseCase(id=48)
public String encryptPassword(String password){
return new StringBuilder(password).reverse().toString();
}
}
}
复制代码
下面的程序是用来处理注解的,需要用到反射
public class UseCaseTracker{
public static void TrackUseCases(List<Integer> useCases, Class<?> cl){
for(Method m: c1.getDeclaredMethods()){
UseCase uc =m.getAnnotation(UseCase.calss);
if(uc!=null){
System.out.println("Found Use Case :" + uc.id()+" "uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for(int i: useCases){
System.out.println("Warning : Missing use case-"+ i);
}
}
public static void main (String[] args){
List<Integer> useCases=new ArrayList<Integer>();
Collections.addAll(useCases, 47,48);
trackUseCases(useCases, PasswordUtils.class);
}
}
复制代码
作者:
创造命运
时间:
2014-4-24 19:28
张稳 发表于 2014-4-24 16:13
就好像老师说的注解是一个学生挂了一个牌子,证明是本学校的,注解的属性就是牌子是什么颜色,用于区分你是 ...
非常给力,明白一些了。谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2