注解,英文Annotation,他究竟起的什么作用,为什么就需要使用注解呢?
注解是JDK1.5才引入的。它的作用可以从三方面来说,
第一个用于编写文档,通过在代码中设置注解可以生成文档【Javadoc文档】;
第二个是代码分析,通过代码里标识的元数据对代码进行分析【使用反射】 ;
第三个是编译检查,通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】。
了解了注解的基本功能,我们要来看看注解是什么,有哪些注解。我们先关注一下java自带的注解。
1 public class OverrideDemoTest { 2 //@Override 3 public String tostring() { 4 return "测试注解"; 5 } 6 }
@Deprecated
它的作用是对不应该再使用的方法添加注解
1 public class DeprecatedDemoTest { 2 public static void main(String[]args) { 3 // 使用DeprecatedClass里声明被过时的方法 4 DeprecatedClass.DeprecatedMethod(); 5 } 6 } 7 8 class DeprecatedClass { 9 @Deprecated 10 public static void DeprecatedMethod() { 11 } 12 }
@SuppressWarnings
1 public class SuppressWarningsDemoTest { 2 public static List list = new ArrayList(); 3 @SuppressWarnings("unchecked") 4 public void add(String data) { 5 list.add(data); 6 } 7 }
上面三个注解是jdk自带的,只能完成一些简单的功能,如果想要让注解发挥更大作用,就需要编程人员自定义注解。元注解就此出现——@Retention @Target @Document @Inherited四种。
自定义注解样例:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
1 @Retention: 定义注解的保留策略
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含;
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得;
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到;
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。
2 @Target:定义注解的作用目标
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
3 @Document:说明该注解将被包含在javadoc中
4 @Inherited:说明子类可以继承父类中的该注解
详细例子有时间再补