学习要点

  • 注解的概念
  • 注解分类
  • 读取注解信息

注解概述

1  元数据

定义

描述数据的数据。

用处

文档编制、编译器检查、代码分析等

2  Java注解

  • Annotation in JDK5.0——将元数据引入Java。
  • Java注解:Java代码里的特殊标记。它为在代码中添加用Java程序无法表达的额外信息提供了一种形式化的方法。
  • 注解和注释的区别:

注释不会被程序所读取。注释在源代码编译成class文件过程被丢弃。

注解可以在编译、类加载、运行时被读取。

注解的分类

1  内建注解

在java.lang包下提供了3种标准的注解类型,称为内建注解。分别是@Override注解,@Deprecated注解以及@SuppressWarnings注解。

@Override注解

用来标注方法,标识该方法是重写父类的某方法。

代码示例

  1. /** 水果类 */
  2.  
  3. public class Fruit {
  4.  
  5. public void getObjectInfo(){ //o和0的写法容易混淆
  6.  
  7. System.out.println("执行Fruit类的getObjectInfo方法");
  8.  
  9. }
  10.  
  11. }
  12.  
  13. /**苹果类*/
  14.  
  15. public class Apple extends Fruit {
  16.  
  17. //指定以下方法必须重写父类方法
  18.  
  19. @Override
  20.  
  21. public void getObjectInfo() {
  22.  
  23. System.out.println("执行了Apple重写的Fruit的getObjectInfo方法");
  24.  
  25. }
  26.  
  27. }

  

 @Deprecated注解

标识已过时的程序元素(包括成员方法和成员变量)。编译器不推荐使用。

 @SuppressWarnings注解

  • 用来阻止编译器警告。用来有选择的关闭编译器对类、方法和成员变量等程序元素及其子元素的警告。
  • 抑制多个警告value的写法:

@SuppressWarnings(value={"unused","unchecked"})

@SuppressWarnings({"unused","unchecked"})

  • 抑制单个警告value的写法:

@SuppressWarnings(value="unused")

@SuppressWarnings("unused")

  • 常用注解参数:

 

 

deprecation

使用了过时的程序元素

unchecked

执行了未检查的转换

unused

有程序元素未被使用

fallthrough

switch程序块直接通往下一种情况而没有使用break

path

在类路径、源文件路径等中有不存在的路径

serial

在可序列化的类上缺少serialVersionUID定义

finally

finally子句不能正常执行

all

所有情况

上机练习

需求说明

  • 定义Fruit类,包含名称属性(name)和打印的方法print()。其中name属性标识为已过时
  • 定义苹果类(Apple)继承Fruit类,使用注解限定重写print()方法
  • 在main()方法中实例化两个苹果对象,并使用注解抑制对象未使用的编译器警告信息。

2  元注解

java.lang.annotation包下提供了4个元注解,他们用来修饰其他注解定义。

注解

作用及成员变量

@Target

注解的作用目标,指定被其修饰的注解能用于修饰哪些程序元素。

成员变量value为ElementType 枚举类型

@Retention

注解的保留位置。

成员变量value:RetentionPolicy 枚举类型

@Documented

说明该注解将被包含在javadoc中。

@Inherited

指定被其修饰的注解将具有继承性,说明子类可以继承父类中的该注解。

注:

ElementType:java.lang.annotation.ElementType

RetentionPolicy:java.lang.annotation.RetentionPolicy

示例:

  1. @Target:注解的作用目标        
  2. @Target(ElementType.TYPE)   //接口、类、枚举、注解
  3. @Target(ElementType.FIELD) //字段、枚举的常量
  4. @Target(ElementType.METHOD) //方法        
  5. @Target(ElementType.PARAMETER) //方法参数        
  6. @Target(ElementType.CONSTRUCTOR)  //构造函数        
  7. @Target(ElementType.LOCAL_VARIABLE)//局部变量        
  8. @Target(ElementType.ANNOTATION_TYPE)//注解        
  9. @Target(ElementType.PACKAGE) ///包     
  10.  
  11. @Retention:注解的保留位置
  12. @Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含      
  13. @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,      
  14. @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到    
  15.  
  16. @Document:说明该注解将被包含在javadoc中  
  17.  
  18. @Inherited:说明子类可以继承父类中的该注解

  

3  自定义注解

注解类型是一种接口,但是和普通的接口不同。

定义一个新的注解类型:

  1. public @interface 注解名称 {}

  注解也可以带成员变量

注解中以无参数方法的形式来声明成员变量,例如:

  1. public @interface MyAnnotation {
  2.  
  3. String typeData() default "BigData";
  4.  
  5. }

  使用default关键字为注解类型的成员变量指定初始值。

综合示例

  1. /** 自定义注解 */
  2. package com.etc.andemo;
  3. import static java.lang.annotation.ElementType.METHOD;
    import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6.  
  7. //指定该注解仅作用于方法
  8.  
  9. @Target(METHOD)
  10.  
  11. // 指定该注解可使用反射读取
  12.  
  13. @Retention(RetentionPolicy.RUNTIME)
  14.  
  15. public @interface ImageType {
  16.  
  17. String formater() default "GIF";
  18.  
  19. }
  20.  
  21. /**应用自定义注解*/
  22. package com.etc.andemo;
  23. import java.lang.annotation.Annotation;
  24.  
  25. public class ImageHelper {
  26.  
  27. @ImageType(formater = "GIF")
  28.  
  29. public void checkType() throws SecurityException, NoSuchMethodException {
  30.  
  31. Annotation[] anns = ImageHelper.class.getMethod("checkType")
  32.  
  33. .getAnnotations();
  34.  
  35. for (Annotation ann : anns) {
  36.  
  37. if (ann instanceof ImageType) {
  38.  
  39. if (((ImageType) ann).formater().equals("GIF")) {
  40.  
  41. System.out.println("这是一张GIF图片");
  42.  
  43. } else if (((ImageType) ann).formater().equals("PNG")) {
  44.  
  45. System.out.println("这是一张PNG图片");
  46.  
  47. } else {
  48.  
  49. System.out.println("其他类型图片");
  50.  
  51. }
  52.  
  53. }else{
  54.  
  55. System.out.println("没有合适的注解!");
  56.  
  57. }
  58.  
  59. }
  60.  
  61. }
  62.  
  63. }
  64.  
  65. /**测试*/
  66. package com.etc.andemo;
  67.  
  68. public class Test {
  69.  
  70. public static void main(String[] args) throws SecurityException, NoSuchMethodException {
  71.  
  72. ImageHelper im=new ImageHelper();
  73.  
  74. im.checkType();
  75.  
  76. }
  77.  
  78. }

  

上机练习

需求说明

  • 自定义注解,只能修饰方法,包含一个成员变量age,有默认值20
  • 定义Student类,包含验证年龄的方法,使用自定义注解修饰,在此方法中读取注解中的年龄信息并进行判断,如果年龄在18岁以下,提示“未成年”,否则,提示“具备入学基本条件”
  • 定义测试类

JavaSE-23 注解的更多相关文章

  1. 用大白话聊聊JavaSE -- 自定义注解入门

    注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如 ...

  2. Java匹马行天下之JavaSE核心技术——注解

    Java注解 一.什么是注解 注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器.开发工具和其他程序可以通过反射来 ...

  3. JavaSE25-Junit&注解

    1.Junit单元测试 1.1 测试分类 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具体的执行流程. Junit使用:白盒测试 步骤: ...

  4. Java枚举类、注解和反射

    本文主要介绍的是枚举类,注解和反射.还有一些基础知识:static,基本数据类型,运算符优先级放在文中,以便查阅复习. 其中牵扯到泛型的部分,可参考本人的另一篇博客:(Collection, List ...

  5. java枚举和注解

    枚举 一.枚举(enumeration) 是一组常量的集合,可以理解为:枚举属于一种特殊的类,里面只包含一组有限的特定的对象,构造方法默认为private. 二.枚举的两种实现方式 1.自定义实现枚举 ...

  6. JAVA $ JSP

    1. java中数据类型分为两种   基本数据类型:数值型,字符型,布尔型   引用数据类型:类,接口,数组 基本数据类型所占空间固定,有别与C++,java中没有无符号数byte:1字节short: ...

  7. Java中的各种o

    java的po vo dao dto pojo 1各个术语的简介 PO(persistant object)持久对象 最形象的理解就是一个PO就是数据库中的一条记录.PO是在ORM中出现的概念,就是O ...

  8. JSON在各种语言中的运用

    1. JSON数据格式 JSON(JavaScript Object Notation) 从结构上看,所有的数据最终都可以分成三种类型:  第一种类型是scalar(标量),也就是一个单独的strin ...

  9. Java匹马行天下之新手学习目录

    Java匹马行天下之新手学习目录 学习路线 [Java匹马行天下——Java学习路线] [Java匹马行天下——开篇学习计划] 基础篇 [Java匹马行天下之学编程的起点——编程常识知多少] [Jav ...

  10. JavaSE学习总结(十五)—— Java反射与注解

    一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...

随机推荐

  1. Servlet单例非安全解析

    Servlet容器默认是采用单实例多线程的方式处理多个请求 Servlet容器<Web容器<应用服务器?apache<tomcat<websphere Servlet不是线程安 ...

  2. Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...

  3. python的termcolor模块

    termcolor是一个python包,可以改变控制台输出的颜色,支持各种terminal(WINDOWS的cmd.exe除外). 它支持下列的文字颜色: grey, red, green, yell ...

  4. 从事UNIX/LInux服务器编程最方便的代码编译工具------(eclipse for c/c++)、(FileZilla)、(Secure CRT) 这三种一定要一起使用 之1

    今天主要是将前几天搞的Linux学习的心得写出来,希望帮助更多的人进行,方便从事Unix和Linux编程的同行和刚入门者.主要介绍三种工具并给出安装过程,请大家不必怀疑这个博文,此博文是我自己原创.请 ...

  5. 希尔排序(Shellsort)

    首先,Shell是发明这个算法的人名,不是这个算法的思想或者特点. 希尔排序,也称为增量递减排序.基本思路,是把原来的序列,等效视为一个矩阵的形式.矩阵的列数,也称为宽度或者增量,记为w. 假设数组A ...

  6. bzoj 3456: 城市规划【NTT+多项式求逆】

    参考:http://blog.miskcoo.com/2015/05/bzoj-3456 首先推出递推式(上面的blog讲的挺清楚的),大概过程是正难则反,设g为n个点的简单(无重边无自环)无向图数目 ...

  7. [App Store Connect帮助]七、在 App Store 上发行(3.2)提交至“App 审核”:查看 App 状态历史记录

    您可以查看您 App 的某一版本的 App 状态历史记录.在历史记录表中的每一行都包含 App 状态.App 状态更改时间,以及更改的发起人.使用此信息追踪“App 审核”流程中的 App. 若想在 ...

  8. 安装MySQL需要注意的事项

    一.安装MySQL之后,怎样启动MySQL,以及登录.查看数据库操作? 用管理员身份运行cmd或power shell 二.当然有可能会出现不能在cmd或power shell中登录数据库账户 造成这 ...

  9. SAMP论文学习

    SAMP:稀疏度自适应匹配追踪 实际应用中信号通常是可压缩的而不一定为稀疏的,而且稀疏信号的稀疏度我们通常也会不了解的.论文中提到过高或者过低估计了信号的稀疏度,都会对信号的重构造成影响.如果过低估计 ...

  10. 题解报告:hdu 1060 Leftmost Digit

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060 问题描述 给定一个正整数N,你应该输出N ^ N的最左边的数字. 输入 输入包含多个测试用例. ...