一、注解是什么

java 注解用于为 java 代码提供元数据,看完这句话也许你还是一脸懵逼,用人话说就是注解不直接影响你的代码执行,仅提供信息。接下我将从注解的定义、元注解、注解属性、自定义注解、注解解析jdk 提供的注解这几个方面再次了解注解(annotation)

二、jdk支持的注解有哪些

2.1 三种常用的注解:

@suppresswarnings     该注解的作用是阻止编译器发出某些警告信息。它可以有以下参数:  

deprecation :过时的类或方法警告。    
unchecked:执行了未检查的转换时警告。    
allthrough:当switch程序块直接通往下一种情况而没有break时的警告。    
path:在类路径、源文件路径等中有不存在的路径时的警告。        
serial:当在可序列化的类上缺少serialversionuid定义时的警告。     
finally:任何finally子句不能完成时的警告。       
all:关于以上所有情况的警告

@deprecated       该注解的作用是标记某个过时的类或方法。

@override     该注解用在方法前面,用来标识该方法是重写父类的某个方法。

2.2 元注解

元注解主要是用来注解自定义注解的注解,分别有@retention、 @target、 @document、 @inherited和@repeatable(jdk1.8加入)五种。

下面讲两个平常最常用的注解:

@retention 注解的生命周期,主要有

retentionpolicy.source 仅存在于源码中
 
retentionpolicy.class 默认的策略,在class字节码文件中存在,但运行时无法获得
 
retentionpolicy.runtime 在运行时可以通过反射获取到,也是最常用的。

@target 注解的作用目标,主要有

 elementtype.type  作用接口、类、枚举、注解
 
 elementtype.field 作用属性字段、枚举的常量
 
 elementtype.method 作用方法
 
 elementtype.parameter 作用方法参数
 
 elementtype.constructor 作用构造函数
 
 elementtype.local_variable 作用局部变量
 
 elementtype.annotation_type 作用于注解(@retention注解中就使用该属性)
 
 elementtype.package 作用于包
 
 elementtype.type_parameter 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)

三、注解实例

在枚举中编译器只会限制枚举的名字不能重复,在开发中经常会遇到枚举id 重复的问题,因为每个人在开发功能的时候一般只会专注于自己的功能,做完只会直接提交代码,不会注意到枚举id冲突,这个时候可以使用下面的代码进行枚举自检,在项目的开发阶段就能及时发现代码的问题。下面的代码稍微修改下就可以在项目中使用,拿走不写。

1、自定义注解

检测枚举的key 是否有重复

package org.pdool.anno;
 
import java.lang.annotation.elementtype;
import java.lang.annotation.retention;
import java.lang.annotation.retentionpolicy;
import java.lang.annotation.target;
/**
* @author 香菜
*/
@retention(retentionpolicy.runtime)
@target(elementtype.method)
public @interface checkenum {
}

2、在对应的方法上增加注解

package org.pdool.anno;
/**
* 资源枚举类
* @author 香菜
*/
public enum restype {
   gold(1),
   diamond(2),
   //注意:此处重复
   silver(2);
   int type;
 
   @checkenum
   public int gettype() {
       return type;
  }
 
   restype(int type) {
       this.type = type;
  }
}

3、在项目启动的时候检查注解的枚举

package org.pdool.anno;
 
import java.lang.reflect.invocationtargetexception;
import java.lang.reflect.method;
import java.util.hashset;
import java.util.set;
 
/**
* @author 香菜
*/
public class aain {
   public static void main(string[] args) throws invocationtargetexception,illegalaccessexception {
       // 获取有注解的方法
       method[] declaredmethods = restype.class.getdeclaredmethods();
       method annomethod = null;
       for (method declaredmethod : declaredmethods) {
           checkenum  annotation = declaredmethod.getannotation(checkenum.class);
           if (annotation != null){
               annomethod = declaredmethod;
              break;
          }
      }
       set<object> set = new hashset<>();
       // 遍历每个枚举的id
       object[] oo = restype.class.getenumconstants();
       for (object o : oo) {
           object invoke = annomethod.invoke(o);
           if (!set.contains(invoke)){
               set.add(invoke);
          }else {
               system.out.println("重复的key "+ o +" -- "+ invoke);
          }
      }
  }
}

注:上面的代码只是简单的实例,只是为了展示核心代码,在项目中使用时可以修改类的获取为扫描项目下的包,遍历所有的枚举,就可以在项目中使用了。

四、总结

注解虽然不影响代码的运行,但是可以为运行中的程序提供更多的信息,注解也是很多框架的基本技术切入点,比如spring 的注解,lombok 的各种注解,都是使用了注解做了很多事,明白了注解是怎么回事,理解框架也会轻而易举。

到此这篇关于详解java注解知识点的文章就介绍到这了,更多相关java注解内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!