经常看到@Override这样的东西,原来不知道是啥,后来简单学习了一下,然后看了一下Override的源码,觉得很神奇,下边的源码什么都没做,编译器是怎么操作的。。。。
/* * %W% %E% * * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.lang; import java.lang.annotation.*; /** * Indicates that a method declaration is intended to override a * method declaration in a superclass. If a method is annotated with * this annotation type but does not override a superclass method, * compilers are required to generate an error message. * * @author Joshua Bloch * @since 1.5 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
这几天学习一下注解,最起码要达到自己写一个注解,实现一下override注解。。 对于注解我的认知基本上是0,所以有什么不对的地方大神勿喷,以后的学习过程中如果发现有错也会回来纠正的,也算一个提高的过程吧。
今天先简单学习一下注解。首先是注解的定义,使用@interface定义,如下:
public @interface MyAnnotation{}
定义一个注解。@interface是注解唯一的实现方式。
定义了一个注解之后,还需要定义注解的类型属性和策略范围。
用@Target 定义一个注解的类型属性,表示这个注解可以在什么地方被使用。如下:
@Target(value = {ElementType.METHOD,ElementType.CONSTRUCTOR}) public @interface MyAnnotation{}
表示这个注解只能在方法,构造函数使用。下面这个方法报错:
package Java201512; /** * annotaTest : * @author xuejupo [email protected] * create in 2015-12-9 下午8:20:59 */ public class annotaTest { /** * test: ttttest * void 返回类型 */ @MyAnnotation public void test(){ } }
@ Target可以有一个或多个参数,也可以没有@ Target解释。没有@Target则认为该注解可以在任何地方使用。@Retention表示该注解的策略范围,即该注解将跟随代码到什么时候。@Retention和@Target的参数只能取特定枚举中的参数,所有参数如下:
@ Target:
package java.lang.annotation; public enum ElementType { TYPE, /* 类、接口(包括注释类型)或枚举声明 */ FIELD, /* 字段声明(包括枚举常量) */ METHOD, /* 方法声明 */ PARAMETER, /* 参数声明 */ CONSTRUCTOR, /* 构造方法声明 */ LOCAL_VARIABLE, /* 局部变量声明 */ ANNOTATION_TYPE, /* 注释类型声明 */ PACKAGE /* 包声明 */ }
@Retention
public enum RetentionPolicy { SOURCE, /* Annotation信息仅存在于编译器处理期间 */ CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */ RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */ }
解释一下自己理解的 @Retention:
SOURCE 一般用于编译器检查,我们应该用不到,当然如果有大神打算自己写编译工具的话是用得到。比如Override就是SOURCE的,这表示当代码从.java文件编译为.class文件时,Override就不见了,所以这种注解只是用来进行编译检查。
Runtime,如果我们自己写自定义的注解的话,这种应该是最多的,他可以让我们在编译好的文件里面获取注解信息,用于检查自定义的注解所在位置是否符合注解内容或者注入注解信息。
CLASS 字面意思是存在与.CLASS文件中,但是还不知道啥意思。。。 改天再来更新
以下是个人的理解:
注解也可以认为是一个接口,特殊的接口,所以注解里也可以有方法,可以有变量,如下:
package Java201512; import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.annotation.Inherited; /** * MyAnnotation : 我的注解 * @author xuejupo [email protected] * create in 2015-12-9 下午7:52:16 */ @Target(value = {ElementType.METHOD,ElementType.CONSTRUCTOR}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface MyAnnotation{ String[] value(); int[] intValue(); String[] s() default {"test"}; int i = 1; }
每一个使用注解的地方,相当于实现注解的一个具体对象。。。必须实现注解中没有默认值的方法 如下:
package Java201512; /** * annotaTest : * @author xuejupo [email protected] * create in 2015-12-9 下午8:20:59 */ public class annotaTest { @MyAnnotation(intValue = { 0 }, value = { "" }) public void test(){ } }
注解的定义其实是很简单的,难在怎么使用他。。
改天再更新注解的使用。。。。