Java注解总结(史上最全,有这一篇就够了)
什么是注解?
注解的定义官网描述如下: Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。 将上面的话再翻译一下,如下: 综上,注解是一种元数据,可以将它理解为注释、解释,它为我们在代码中添加信息提供了一种形式化的方法,它用于帮助我们更快捷的写代码。 注解的分类一般常用的注解可以分为三类: 1、Java自带的标准注解 2、元注解 3、自定义注解 注解的使用使用Java自带的注解 @Override //在需要注解的方法上面@Override即可 protected void onCreate() { } 常用的Java注解如下:
其中,4、5、6、8多用于自定义注解,读者着重记一下。 自定义注解在Java中,我们使用@interface注解来自定义一个注解,如下: public @interface MyTestAnnotation { } 此时,我们已经定义了一个注解MyTestAnnotation ,接着我们就可以在类或者方法上作用我们刚刚新建的注解: @MyTestAnnotation public class Test { @MyTestAnnotation public static void testString(){ } } 此时,我们已经自定义了一个注解,不过现在这个注解毫无意义。 要如何使注解工作呢?这就需要使用元注解了。 常用的元注解有@Retention、 @Target、 @Document、 @Inherited和@Repeatable五个。 @Retention 在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期:
如果我们是自定义注解,则通过前面分析,我们自定义注解如果只存着源码中或者字节码文件中就无法发挥作用,而在运行期间能获取到注解才能实现我们目的,所以自定义注解中肯定是使用 @Retention(RetentionPolicy.RUNTIME),如下: @Retention(RetentionPolicy.RUNTIME) public @interface MyTestAnnotation { } @Target
一般比较常用的是ElementType.TYPE类型,如下: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyTestAnnotation { } @Documented @Inherited @Repeatable 注解的源码分析 @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 我们看到@Override注解就是通过@interface注解定义的一个普通注解,而我们知道,使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation 注意:定义 Annotation 时,@interface 是必须的,它和我们通常的 implemented 实现接口的方法不同。Annotation 接口的实现细节都由编译器完成。通过 @interface 定义注解后,该注解不能继承其他的注解或接口。 下面我们来分析一下Annotation 类的源码,如下: public interface Annotation { boolean equals(Object var1); int hashCode(); String toString(); Class<? extends Annotation> annotationType(); } 通过以上源码,我们知道注解本身就是Annotation接口的子接口,也就是说注解中其实是可以有属性和方法,但是接口中的属性都是static final的,对于注解来说没什么意义,而我们定义接口的方法就相当于注解的属性,也就对应了前面说的为什么注解只有属性成员变量,其实他就是接口的方法,这就是为什么成员变量会有括号,不同于接口我们可以在注解的括号中给成员变量赋值。 Java注解的架构根据上述的源码分析,我们得出Java注解(Annotation)的架构如下: 0、注解是接口类,都继承自Annotation接口类 1、1 个 Annotation 和 1 个 RetentionPolicy 关联 2、1 个 Annotation 和 1~n 个 ElementType 关联 3、Annotation 有许多实现类,包括:Deprecated,Documented,Inherited,Override 等等。 注解的作用在说注解的用途之前,我们先介绍下XML和注解区别:
注解的用途有很多,上面的只是一个简单的例子,总起起来,注解有如下四大部分作用: 1、生成文档,通过代码里标识的元数据生成javadoc文档。 2、编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。 3、编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。 4、运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |