<Java> java注解介绍

前言

  在刚学java web开发的时候,我第一次看到注解不是在java里,而是在spring里,于是很长一段时间里,我都认为注解是spring特有的技术,后来用到mybatis的时候,发现也有不少注解,再加上经常在java中看到的@Override之类的,才怀疑注解是不是java的东西。可是怀疑归怀疑,但是开发都快一年多了,从来没有想过去了解注解这个东西,更别说开发自己的注解了。

Java注解介绍

  近来,项目中有许多额外的xml文件,我一直认为这是非常不好的,联想到spring可以将applicationContext.xml中的东西用注解写进类中,于是在想是不是也可以试试开发自己的注解。

  首先,来看java里面的annotation包。

  

  从IDE的标志就可以看出来,有四个注解隐藏在其中,这四个注解正是java的元注解,也就是”注解的注解“。它们依次是:

  1.Document:没有参数,就是表明将这个注解包含在javadoc中

  2.Inherited:没有参数,表明可以被继承

  3.Retention:有参数(可选项就在下一个RerentionPolicy中),表明该注解可以被什么级别保存

        1.Source:源码级别,也就是说这个注解就是给编译器看看的,看完就扔了,不会被编译,也就是在.class文件中是找不到的,比如@Override

        2.Class:能在class文件中找到,但是在VM运行时是找不到的。这个是默认级别。

        3.Runtime:在VM运行时都能保留,因此可以通过java反射机制来读取注解信息,一般来说这个用的最多。比如:@Value、@Controller、@Bean

  4.Target:有参数(可选项在ElementType中),表明该注解可以被放在类的哪个层面上,默认是全部。

  有了这几个,就已经可以开发自己的注解了,试一下:

@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
    String book() default "";
}

public class Book {
    @Info(book = "Thinking in java")
    String bookName;

    public String getName(){
        return bookName;
    }
    
    public static void main(String[] args) {
        Field[] fields = Book.class.getDeclaredFields();
        for (Field field : fields){
            if(field.isAnnotationPresent(Info.class)){
                Info info = field.getAnnotation(Info.class);
                Book book = new Book();
                book.bookName = info.book();
                System.out.println(book.getName());
            }
        }
    }
}  

  简单到爆,当然稍微需要有点java的反射基础知识。一般我们用spring,mybatis之类的框架注解时,不用写这些解析反射的代码,是因为框架帮我们做好了。

posted @ 2015-04-15 15:49  丶千纸鸢  阅读(254)  评论(0编辑  收藏  举报