jdk1.5之后提供了注解(Annotation)这一种语法。其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一般自定义的注解都是这一种功能)

一、JDK提供的常用注解(Override、Deprecated、SuppressWarnings)

  • @Override
    表示子类重写了父类的方法,或者实现了接口的方法。帮助开发者确认子类是否正确的覆盖了父类的方法,若父类中没有此方法,编译器即报错。但是,子类与父类有同样的方法,但子类的方法上没有@Override注解,是不会报错。
class MyThread implements Callable<Integer>{//实现callable接口的方法@Overridepublic Integer call() throws Exception {return 200;}
}
  • @Deprecated
    用于提示开发者,标注此注解的方法已经被弃用了。请使用另外推荐的方法
@Deprecatedpublic void call(){System.out.println("expired...");}

  • @SuppressWarnings
    抑制警告的意思。例如新建一个变量,但是没有用,编译器会提示此变量未使用的警告。如果在方法中,添加了@SuppressWarnings的相关注解,这个警告就不会再提示了。
@SuppressWarnings({"unused"})public static void main(String[] args){List<Integer>list=new ArrayList<>();}

完整架构:

二、自定义注解

除了java自带的注解,也可以自定义注解,用于帮助为相关代码打上标签,然后我们在解析注解的逻辑中就可以通过这些标签来完成相关的工作,比如,权限控制,日志等。

  1. 语法
1.定义一个自定义注解,与定义一个接口类似,只不过在interface前加是哪个@。
2.其内部可以添加属性值,其属性值的定义为:修饰符 返回值类型 属性名() [default value]其中,修饰符只能用public 和abstract。返回值为基本类型、字符串、枚举、注解以及以上类型的一维数组。
3.定义自定义注解,还需要用到元注解,用于修饰自定义注解,
一般我们会用到两个。@Retention和@Target。

@Retention

//用于确定注解的生命周期。其有三个枚举变量可选
public enum RetentionPolicy {/*** SOURCE级别表示代码级别可见,经过编译器编译生成字节码对象时,此注解就没了。* 比如@override就是代码级别可见*/SOURCE,  /*** CLASS表示字节码对象级别可见,但是字节码对象被虚拟机加载时,* 这个注解会被抛弃,这是默认的可见级别*/CLASS,/*** RUNTIME表示运行时也可见,当虚拟机加载字节码对象时,此注解仍然可见。* 因此可以通过反射获取注解信息,然后完成相应的注解解析工作,一般自定义的注解都是运行时可见。*/RUNTIME
}

@Target

//用于修饰此注解可以用于什么类型上。比如注解可以用在类级别、方法、成员字段或者构造函数上。
public enum ElementType {/** 可以修饰类*/TYPE,  /**可以修饰字段*/FIELD,/** 可以修饰方法*/METHOD,/** Formal parameter declaration */PARAMETER,/** 构造方法*/CONSTRUCTOR,LOCAL_VARIABLE,ANNOTATION_TYPE,PACKAGE,/*** Type parameter declaration** @since 1.8*/TYPE_PARAMETER,/*** Use of a type** @since 1.8*/TYPE_USE
}
  1. 简单的自定义注解例子
@Target({ElementType.METHOD,ElementType.TYPE})//这个注解可以修饰方法和类
@Retention(RetentionPolicy.RUNTIME)//可见范围到运行时都可见。
public @interface LogRecord {/** 下面时候注解的属性 **/  public String operationType() default "";
}

注意,注解的返回值只能是基本类型、Class、String、enum、Annotation 类型、以上所有类型的数组

  1. 完整的注解自定例子

上述定义的自定义注解,只是一个空的定义,没有任何的意义。因此需要我们自己定义相关的自定义注解的解析。上面提到,自定义的注解需要定义注解的可见范围。一般我们都定义为运行时可见。因此,通过反射,我们可以拿到注解的内容。通过反射拿到代码的注解内容,进行相关的逻辑处理工作,以达到注解的目的。

//通过反射获得注解内容的常用方法有:
T getAnnotation(Class) : 获得当前对象的指定的注解。
Annotation[] getAnnotations() X: 获得当前对象的所有注解
boolean isAnnotationPresent(annotationClass): 当前对象是否有注解。

球队注解:

@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FootBallTeam {public String value() default "Guangzhou Evergrande Taobao Football Club";
}
public class testAnnotation {public static void main(String[] args) {testAnnotation test = new testAnnotation();test.getInformation(Team.class);}public void getInformation(Class<?> clazz) {//因为注解是在成员字段上,因此需要获得类的所有字段信息Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {//判断这个字段上是否有相应的注解信息(FootBallTeam.class)if (field.isAnnotationPresent(FootBallTeam.class)) {FootBallTeam footBallTeam = field.getAnnotation(FootBallTeam.class);System.out.println("球队名字是" + footBallTeam.value());}}}
}
class Team{@FootBallTeam("Real Madrid")private String teamName;
}

在spring中大量应用了注解结合反射机制,实现ioc、aop等功能,更多详解看大佬文章。

java自定义注解解析及自定义注解相关推荐

  1. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  2. 【Java 注解】自定义注解 ( 注解解析 )

    文章目录 一.定义注解 二.使用注解 三.解析注解 四.通过注解对象获取注解属性的原理 在 [Java 注解]自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ; 在 [Java 注解] ...

  3. java自定义注解解析

    开始接触java注解的时候,感觉是个很高深的概念,经过一段时间的学习,对注解有了新的认识,并没有想象的那么复杂. 注解本质上就是一个标记,是给程序看的. 如果自定义了一个注解,但是没有对自定义的注解做 ...

  4. Java魔法堂:自定义和解析注解

    一.前言 注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然 ...

  5. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  6. 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器

    深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...

  7. java注解 源码_详解Java注解教程及自定义注解

    详解Java注解教程及自定义注解 更新时间:2016-02-26 11:47:06   作者:佚名   我要评论(0) Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个 ...

  8. java注解_Java注解教程及自定义注解

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  9. return error怎么定义_这一次搞懂Spring自定义标签以及注解解析原理

    自定义标签解析原理 在上一篇分析默认标签解析时看到过这个类DefaultBeanDefinitionDocumentReader的方法parseBeanDefinitions:拉勾IT课小编为大家分解 ...

最新文章

  1. 汇编语言随笔(16)- 对磁盘进行读写(int 13h 中断例程)和实验 17
  2. 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
  3. linux 实时 网口 速率_Linux 命令行网络端口速度测试
  4. C++学习之路 | PTA乙级—— 1074 宇宙无敌加法器 (20 分)(精简)
  5. 为什么普通红包自己不能领_我的拼多多不能领红包是怎么回事呢?
  6. Angular学习笔记(五) - 自定义表单控件
  7. 初始Hibernate-关于hibernate的三种状态
  8. 电影图标:杀死比尔(Kil Bill)
  9. 跳楼机(同余类最短路)
  10. [Dubbox异常] Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache[
  11. PHP 图片合成、仿微信群头像
  12. 未明学院:产品经理到底在职场中过得怎么样?
  13. 如何提高孩子专注力?
  14. ai是个什么软件,和PS一样么
  15. linux bash 漏洞修复方法
  16. MySQL修改字段、修改表索引等操作
  17. Istio的流量镜像
  18. 不到 100 行 Python 代码即可实现换脸功能
  19. Odoo产品分析 (三) -- 人力资源板块(7) -- 费用追踪(1)
  20. 网上说的神乎其神的python到底怎么样?值不值得小白学习?

热门文章

  1. jsonpath的用法
  2. 排球比赛计分规则功能说明书
  3. Android 单元测试学习计划
  4. ibatis mybatis传入List参数
  5. ASP.NET MVC 传值方法ViewData与ViewBag的区别
  6. 【MOSS】Sharepoint大附件上传
  7. 做爱做的事,做有快感的事
  8. 语音识别-过零率和短时能量-端点检测
  9. Golang 入门笔记(二)下
  10. Hadoop集群完全分布式模式环境部署