Java注解简述

来源:互联网 发布:红外线控制开关软件 编辑:程序博客网 时间:2024/05/18 03:17

Java注解简述

国庆假期前后,基本是看一下开源的项目,发现不少优秀的开源项目都用了注解和动态代理相关的知识,所以顺带有好好地研读了一下注解和动态代理,加深了对注解和动态代理的认识。博客都差不多接近要断了,前一段七七八八地看了各种东西,一直都没有写东西,懒惰了很多。整的现在很多东西都没有做好,突然觉得不仅仅是专业学习,其他的各种东西也应该有点追求。力求生活精致。

Java从JDK5开始引入了注解(Annotation),也称元数据,它可以用于创建文档,代码依赖性跟踪,甚至编译时的基本检查。注解基本格式是@注解名称。经常遇到的一个例子如下:

@Overridepublic String toString(){    return "annotation string";}

Java注解可以应用到包,类,方法,字段,局部变量上面。另外Java可以通过反射去读取注解的内容。

Java内置注解

Java内置了三个注解,定义在java.lang包里面:
- Override:重载检查
- Deprecated: 使用过时的代码的提示
- SuppressWarnings:提醒,像uncheck,serial等

这些个也都是我们经常使用的注解,特别是Override,在继承的时候加上注解,能够对继承进行检查。像本文第一段代码就是使用了Override。下面这段就是Override的源码:

    package java.lang;    import java.lang.annotation.*;    @Target(ElementType.METHOD)    @Retention(RetentionPolicy.SOURCE)    public @interface Override {    }

自定义注解

Java出了内置了注解,也同样是允许自定义注解的。自定义注解也跟Override的实现完全一样。比如说我们想要实现一个Hello注解,只需要使用如下代码:

    package java.lang;    import java.lang.annotation.*;    @Retention(RetentionPolicy.RUNTIME)    public @interface Hello {        String haha() default "ha";        String haha1() default "ha1";    }

这样就可以像使用Override一样使用Hello注解了。其中@interface是声明一个注解,自动继承了java.lang.annotation.Annotation接口,编译器程序会完成其他部分,在定义注解时,不能继承其他注解或接口。@Retention是用来设置作用范围,默认时RetentionPolicy.CLASS,它也是一种保留范围,CLASS保留在class文件中,但VM运行时不保存,RUNTIME保留在class,运行时可以反射读取注解的值。

@Target是用来指定适用的元素种类。如果不添加的话,任何元素都能够使用。注解里面的方法是注解的变量,可以设置默认值,类型基本变量都可以。

读取注解的值

注解的值可以在运行的时候读取出来,只要@Retention设置为RUNTIME就能够被读取出来了。不过读取出来的具体方法就需要去了解下了。

比如我们使用之前定义的Hello注解

@Helloclass TestHello{    @Hello(haha="haha")    public void sayHello(){}    @Hello(haha="hahastr")    public void hello;}

类注解

Class<TestHello> cl = TestHello.classHello h = cl.getAnnotation(Hello.class);System.out.println(h.haha()+","+h.haha1());

函数注解

Class<TestHello> cl = TestHello.classMethod method = cl.getMethod("sayHello",new Class[0]);Hello h = (Hello)method.getAnnotation(Hello.class);

字段,构造函数的使用方式都是一样的。程序可以在运行的时候读取注解

处理注解的工具APT

APT(Annotation Processing Tool)就是jdk在1.5提供的帮助注解处理过程的工具。它的作用是在编译源文件之前,通过一个自定义的注释处理器去解释并处理源文件的注释,并且由注释处理器生成一些新的源文件,字节码文件,或其他文本文件。APT也会对新的源文件进行处理,知道没有新的源文件产生。

使用了注解的一些工具

现在很多开源第三方Android项目都是使用了注解,

像依赖注入库Dagger就是使用了很多注解去实现注入,并且利用注解处理工具在编译时生成辅助类,在运行时完成注入。

另外又比如ButterKnife,也是一种依靠注入的开源库,不过ButterKnife是Android中通过id自动绑定java中的View变量与layout中描述的View的一个开源库。

以及我前面看过的Retrofit,那是一个将Http访问简化成与ORM一样的开源库。很多第三方库都使用注解来方便开发者使用,但是其中的原理还是应该了解一下。

Spring中用到的注解就更多了,以及很多ORM都是用注解方便开发。

0 0
原创粉丝点击