详解Java注解知识点

网友投稿 217 2022-10-26


详解Java注解知识点

一、注解是什么

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

二、jdk支持的注解有哪些

2.1 三种常用的注解:

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

deprecation :过时的类或方法警告。    

unchecked:执行了未检查的转换时警告。    

allthrough:当Switch程序块直接通往下一种情况而没有Break时的警告。   

path:在类路径、源文件路径等中有不存在的路径时的警告。       http://

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 作用局部变量

 Elemehttp://ntType.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 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);

          }

      }

  }

}

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

四、总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:梯度下降(Gradient Descent)小结
下一篇:jvm监控工具jps,jstat,jstack,jmap的使用方法
相关文章

 发表评论

评论列表