学习Java注解

注解,英文Annotation,他究竟起的什么作用,为什么就需要使用注解呢?

 

  注解是JDK1.5才引入的。它的作用可以从三方面来说,

第一个用于编写文档,通过在代码中设置注解可以生成文档【Javadoc文档】;

第二个是代码分析,通过代码里标识的元数据对代码进行分析【使用反射】 ;

第三个是编译检查,通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】。

 

  了解了注解的基本功能,我们要来看看注解是什么,有哪些注解。我们先关注一下java自带的注解。

@Override
它的作用是对覆盖超类中方法的方法进行标记
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

其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当 switch 程序块直接通往下一种情况而没有 break 时的警告
path,在类路径、源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID 定义时的警告
finally ,任何 finally 子句不能正常完成时的警告
all,关于以上所有情况的警告
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:说明子类可以继承父类中的该注解

 

详细例子有时间再补

 

posted @ 2018-08-07 18:09  难懂的人123  阅读(380)  评论(0编辑  收藏  举报