详解Java注解知识点

一、注解是什么

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注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • 详解Java进阶知识注解

    一.注解的概念 1.注解官方解释 注解 叫元数据,一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举在同一个层次,它可以声明在包.类.字段.局部变量.方法参数等的前面,用来对这些元素进行说明.注释. 注解的作用分类 编写文档:通过代码里表示的元数据生成文档[生成doc文档] 代码分析:通过代码里表示的元数据进行分析[使用反射] 编译检查:通过代码里表示的元数据让编译器能够实现基本的编译检查[Override] 注解按照运行机制分类 源码注解:注解只在源码中存在,编译成

  • java中@SuppressWarnings注解用法详解

    SuppressWarnings注解是jse提供的注解.作用是屏蔽一些无关紧要的警告.使开发者能看到一些他们真正关心的警告.从而提高开发者的效率 简介: java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息. 使用: @SuppressWarnings("") @SuppressWarnings({}) @Suppre

  • JAVA基础之注解与反射的使用方法和场景

    注解 注解定义 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和注释不同,Java 标注可以通过反射获取标注内容.在编译器生成类文件时,标注可以被嵌入到字节码中.Java 虚拟机可以保留标注内容,在运行 时可以获取到标注内容 . 当然它也支持自定义 Java 标注. 注解与注释的区别:注解是给机器看的注释,而注释是给程序员看的提示,编译时自动忽略注释. 使用场景 编译格式检查 反射中解

  • Java 注解学习笔记

    注解说明 Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据.为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据.Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取注解内容.在编译器生成类文件时,注解可以被嵌入到字节码中.Java虚拟机可以保留注解内容,在运行时可以获取到注解内容. 内置注解 Java定义了一套注解,共有7个,3个在java.lang中,剩下4个

  • 如何动态修改JavaBean中注解的参数值

    我这里有一个需求需要修改Person类中的一个属性上的注解的值进行修改,例如: public class Person { private int age; @ApiParam(access="lala") private String name; //get set 方法忽略 } 将@ApiParam(access="lala") 修改为@ApiParam(access="fafa"),经过分析是可以实现的,需要用到动态代理进行操作. 具体源码

  • java注解结合aspectj AOP进行日志打印的操作

    在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结合自定义的注解进行进行一些指定参数的打印 例如: 一个分层的架构系统,每层都有自己的指定系统名字,并且每个方法都有自己指定的作用(通过注解指定,在切面的时候取出该参数),而且可以根据注解的指定日志类型(在注解中指定,在切面的时候取出参数进行判断,然后打印相对应的日志格式). 1.首先需要自定义注解: systemName:表示该系统的名称. bizCode:

  • Java元注解meta-annotation和依赖注入详解

    这篇文章既介绍一个技术,又记录一个逐渐探索发现的过程,以供大家参考. 缘起 注意到Java的依赖注入DI规范(起初以为是CDI规范,然后发现是DI规范)有个叫@Qualifier的注解,用于当一个interface或base class有多个实现类时,能选择其中一个实现.如不用这一注解,一般的(按类型)注入就会报错说"不知道要在多个实现中选哪一个".这一注解可以放在一个自定义注解上(例如@MyPreferredImplementation),从而将自定义注解变成一个qualifier

  • java 注解默认值操作

    我就废话不多说了,大家还是直接看代码吧~ package com.zejian.annotationdemo; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Created by wuzejian on 2017

  • java注解的类型知识点总结

    提到java里的注解,和我们平时的注释还是有很大的区别,主要是作为java特性来使用的,跟我们常见的类是同一个使用的层面.关于java注解的类型,我们可以简单分为:自定义注解和元注解.其中元注解里的JDK又有5中注解的类型,下面一起来看看具体的内容讲解吧. 1.自定义注解 定义注解使用关键字: @interface // #1 定义注解 public @interface MyAnno1{ } 2.元注解 用于修饰注解的注解. JDK提供的5种元注解: (1)@Target:用于确定被修饰的自定

  • Java 自定义注解的魅力

    注解是什么? ①.引用自维基百科的内容: Java注解又称Java标注,是JDK5.0版本开始支持加入源代码的特殊语法 元数据 . Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标注内容.在编译器生成类文件时,标注可以被嵌入到字节码中.Java虚拟机可以保留标注内容,在运行时可以获取到标注内容. 当然它也支持自定义Java标注. ②.引用自网络的内容: Java 注解是在 JDK5 时引入的新特性,注解(也被称为 元数据 )为我们在代码

  • java使用@Scheduled注解执行定时任务

    前言 在写项目的时候经常需要特定的时间做一些特定的操作,尤其是游戏服务器,维护线程之类的,这时候就需要用到定时器. 如果此时你刚好用的是spring的话,哪么@Scheduled注解是非常好用的. 使用spring @Scheduled注解执行定时任务: 1,在spring-MVC.xml文件中进行配置 2,直接在代码控制层使用即可 package xkhd.game.fix; import org.springframework.beans.factory.annotation.Autowir

  • java自定义注解验证手机格式的实现示例

    1.@Valid与@Validated的区别 1.1 基本区别 @Valid:Hibernate validation校验机制 @Validated:Spring Validator校验机制,这个也是最常用的 @Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组.注解位置.嵌套验证等功能上有所不同 1.2 作用范围 @Validated:用在类型.方法和方法参数上.但不能用于成员属性(field) @Valid:可以用在方法.构造函数.方法参数和成员属性(fi

  • Spring的@Validation和javax包下的@Valid区别以及自定义校验注解

    1.后台参数校验 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果 spring提供的验证:org.springframework.validation.annotation.Validated; javax提供的验证:javax.validation.Valid; 在检验Contr

  • 3分钟纯 Java 注解搭个管理系统的示例代码

    最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 在我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护页面,有时候觉得自己好像天生不适合干前端,你要是让我研究研究后端的技术,看个中间件源码啊,分析分析什么框架底层原理啊,这都问题不大,偶尔搞一下JS也可以.你要是让我写个css样式,那简直要命了,一点也提不起兴趣,不知道有没有跟我一样的. 今天要介绍的框架直接不用写页面了,话不多说,下边咱们直奔主题 Erupt一个通用后

随机推荐