一篇文章带你搞定JAVA注解

目录
  • 1、注解是什么
  • 2、jdk支持的注解有哪些
    • 2.1 三种常用的注解:
    • 2.2 元注解
  • 3、注解实例
    • 1、自定义注解
    • 2、在对应的方法上增加注解
    • 3、在项目启动的时候检查注解的枚举
  • 4、总结

1、注解是什么

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

2、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加入)

3、注解实例

在枚举中编译器只会限制枚举的名字不能重复,在开发中经常会遇到枚举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);
          }
      }
  }
}

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

4、总结

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

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解java注解相关知识

    定义 1.如果注解中有属性,那么必须给属性赋值. package com.lxc.Test; // 定义一个注解 public @interface Annotation { String name(); // 看似name像一个方法,实际上我们把name称为属性 } 使用上边注解: package com.lxc.Test; public class Test { @Annotation(name="lxc") public void test() { } } 2.如果注解中有属性,

  • 理解Java注解及Spring的@Autowired是如何实现的

    首先我们可以自己写一个注解: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnoSample { String value(); } 注解使用 @interface来标识.这个注解定义了一个属性value,只能作用于方法上,生命周期是运行时. @Target用于指定可以放置注解的位置,这里指定的METHOD说明该注解只能放置到方法上面,还可以指定TYPE(类.接口.枚举类),

  • Java枚举与注解的创建步骤

    枚举 自定义枚举类 创建方法 将构造器私有化,防止直接new 去掉setXXX方法,防止属性直接被修改 在类的内部,直接创建固定的对象 优化:在创建对象时添加final修饰,类就不会被加载 注意事项 对枚举对象/属性使用final+static共同修饰,实现底层优化 枚举对象名通常使用全部大写 枚举对象根据需要,也可以有多个属性 关键字Enum枚举类 创建步骤 使用关键字enum替代class public static final Season SPRING = new Season("春天&

  • Java的枚举,注解和反射(一)

    目录 枚举 什么是枚举? 枚举类的实现 自定义实现枚举类 使用关键字enum定义枚举类 Enum的常用方法 实现接口的枚举类 注解 注解概述 常见的注解 总结 枚举 什么是枚举? 枚举的字面意思就是 一一列举出来 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠.是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY.MONDAY.TUESDAY.WEDNESDAY.THURSDAY

  • java中基本注解的知识点总结

    1.java.lang.Override是一个标记类型注解,它被用作标注方法.他说明了该方法是继承了父类的方法,就是重写了父类中同名方法. @Override public void onCreate(Bundle savedInstanceState) {--.} 这种写法是正确的,如果你写成: @Override public void oncreate(Bundle savedInstanceState) {--.} 编译器会报如下错误:The method oncreate(Bundle

  • Java的枚举,注解和反射(二)

    目录 反射 什么是反射? 反射的用途 反射的具体作用 反射的主要API Class类 总结 反射 什么是反射? 反射是指在程序运行期间,可以通过Reflection Api提供方法可以获取任何类的内部的信息,并能直接操作任意类的方法和属性.反射被视为动态语言的关键. //在反射之前可以做的事情 @Test public void Test1() { //创建Person类的对象 Person person = new Person("name", 78); //通过对象调用其内部的方法

  • 一篇文章带你搞定JAVA注解

    目录 1.注解是什么 2.jdk支持的注解有哪些 2.1 三种常用的注解: 2.2 元注解 3.注解实例 1.自定义注解 2.在对应的方法上增加注解 3.在项目启动的时候检查注解的枚举 4.总结 1.注解是什么 Java 注解用于为 Java 代码提供元数据,看完这句话也许你还是一脸懵逼,用人话说就是注解不直接影响你的代码执行,仅提供信息.接下我将从注解的定义.元注解.注解属性.自定义注解.注解解析JDK 提供的注解这几个方面再次了解注解(Annotation) 2.jdk支持的注解有哪些 2.

  • 一篇文章带你搞定JAVA反射

    目录 1.反射的概念 1.概念 2.获取字节码文件对象的方式 2.1 元数据的概念 2.2 获取class对象的方式 1.访问权限 2.获取方法 2.1 访问静态方法 2.2 访问类方法 3.获取字段,读取字段的值 4.获取实现的接口 5.获取构造函数,创建实例 6.获取继承的父类 7.获取注解 4.反射实例 5.总结 1.反射的概念 1.概念 反射,指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法

  • 一篇文章带你搞定JAVA泛型

    目录 1.泛型的概念 2.泛型的使用 3.泛型原理,泛型擦除 3.1 IDEA 查看字节码 3.2 泛型擦除原理 4.?和 T 的区别 5.super extends 6.注意点 1.静态方法无法访问类的泛型 2.创建之后无法修改类型 3.类型判断问题 4.创建类型实例 7.总结 1.泛型的概念 泛型的作用就是把类型参数化,也就是我们常说的类型参数 平时我们接触的普通方法的参数,比如public void fun(String s):参数的类型是String,是固定的 现在泛型的作用就是再将St

  • 一篇文章带你搞定JAVA Maven

    目录 1.maven是什么,为什么存在?项目结构是什么样子,怎么定位jar 2.Idea 的操作 1.新建maven项目 2.配置仓库 3.添加依赖,添加fastjson的依赖 4.打包项目 3.Maven坐标主要组成 4.maven生命周期 4.1 名词解释 4.2 生命周期 4.3 goal 的概念 4.4 生命周期和phase的关系 5.idea maven的配置 6.POM有2个很重要的关系:聚合.继承 一.聚合 二.继承 7.Maven 中的 profile 8.maven 插件 9.

  • 一篇文章带你搞定JAVA内存泄漏

    目录 1.什么是内存泄漏 2.内存泄漏的原因 3.内存泄漏有哪些情况 3.1 代码中没有及时释放,导致内存无法回收. 3.2 资源未关闭造成的内存泄漏 3.3 全局缓存持有的对象不使用的时候没有及时移除,导致一直在内存中无法移除 3.4 静态集合类 3.5 堆外内存无法回收 4.内存泄漏的解决办法 5.内存问题排查 第一步 首先确认逻辑问题 第二步:分析gc是否正常执行 第三步 确认下版本新增代码的改动,尽快从代码上找出问题. 第四步:开启各种命令行和 导出 dump 各种工具分析 总结: 1.

  • 一篇文章带你搞定 springsecurity基于数据库的认证(springsecurity整合mybatis)

    一.前期配置 1. 加入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <dependency> <groupId>mysql</groupId> &

  • 一篇文章带你搞定SpringBoot中的热部署devtools方法

    一.前期配置 创建项目时,需要加入 DevTools 依赖 二.测试使用 (1)建立 HelloController @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello devtools"; } } 对其进行修改:然后不用重新运行,重新构建即可:只加载变化的类 三.热部署的原理 Spring Boot 中热部

  • 一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.restart.exclude=classpath:/static/** 或者使用: #表示将static目录加入到修改资源会重启的目录中来 spring.devtools.restart.additional-paths=src/main/resource/static 此时对static 目录下的静态

  • 一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃

    由于 Ubuntu 中的汉字输入实在是太不友好了,所以装了个 搜狗输入法,好不容易把 搜狗输入法装好,本以为可以开开心心的搞代码了,然而... pycharm 一打开,就崩溃,关不掉,进程杀死还是不行,只能关机重启. 本以为 pycharm 出现了问题,又重装了两遍,还是不行. 最终发现竟然是搜狗输入法以及 fcitx 输入法的锅 唉,只能老老实实的把 fctix 和搜狗输入法卸载了: (1)Ubuntu 软件里卸载 fctix,然后将键盘输入法系统改成 IBus (2)卸载搜狗输入法 先查找软

  • 一篇文章带你搞定Python多进程

    目录 1.Python多进程模块 2.Python多进程实现方法一 3.Python多进程实现方法二 4.Python多线程的通信 5.进程池 1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象.这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线

随机推荐