学习要点

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

注解概述

1  元数据

定义

描述数据的数据。

用处

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

2  Java注解

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

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

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

注解的分类

1  内建注解

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

@Override注解

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

代码示例

/** 水果类 */

public class Fruit {

   public void getObjectInfo(){  //o和0的写法容易混淆

       System.out.println("执行Fruit类的getObjectInfo方法");

   }

}

/**苹果类*/

public class Apple extends Fruit {

   //指定以下方法必须重写父类方法

   @Override

   public void getObjectInfo() {

       System.out.println("执行了Apple重写的Fruit的getObjectInfo方法");

   }  

}

  

 @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

示例:

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

  

3  自定义注解

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

定义一个新的注解类型:

public @interface 注解名称 {}

  注解也可以带成员变量

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

public @interface MyAnnotation {

   String typeData() default "BigData";

}

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

综合示例

/** 自定义注解 */
package com.etc.andemo;
import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; //指定该注解仅作用于方法 @Target(METHOD) // 指定该注解可使用反射读取 @Retention(RetentionPolicy.RUNTIME) public @interface ImageType { String formater() default "GIF"; } /**应用自定义注解*/
package com.etc.andemo;
import java.lang.annotation.Annotation; public class ImageHelper { @ImageType(formater = "GIF") public void checkType() throws SecurityException, NoSuchMethodException { Annotation[] anns = ImageHelper.class.getMethod("checkType") .getAnnotations(); for (Annotation ann : anns) { if (ann instanceof ImageType) { if (((ImageType) ann).formater().equals("GIF")) { System.out.println("这是一张GIF图片"); } else if (((ImageType) ann).formater().equals("PNG")) { System.out.println("这是一张PNG图片"); } else { System.out.println("其他类型图片"); } }else{ System.out.println("没有合适的注解!"); } } } } /**测试*/
package com.etc.andemo; public class Test { public static void main(String[] args) throws SecurityException, NoSuchMethodException { ImageHelper im=new ImageHelper(); im.checkType(); } }

  

上机练习

需求说明

  • 自定义注解,只能修饰方法,包含一个成员变量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. 【JSOI 2008】 最大数

    [题目链接] 点击打开链接 [算法] 很明显,我们可以用线段树解决此题 只需维护区间最值就可以了 [代码] #include<bits/stdc++.h> using namespace ...

  2. 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap

    最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...

  3. Oracle VM VirtualBox启动新建虚拟机弹错--不能为虚拟机xxxx电脑 打开一个新任务

    有三种方案: 1.先在任务管理器中关掉所有virtualBox的进程,然后进入到C:\Users\Administrator\VirtualBox VMs\ 将相应guest的文件夹随便改个名字,再重 ...

  4. element-ui公用模态框自定义样式与scoped样式生效问题解决方案

    //先插如效果图 里面内容均为传进来的.包括取消与确定按钮,因为每个页面的绑定事件不一样. //下面这个图片为初始样式 //拖动模态框指令需要插件.详情看我下一篇,以下是地址 https://www. ...

  5. nginx 配置tp3.2

    server { listen 80; server_name 域名; #charset koi8-r; #access_log /var/log/nginx/host.access.log main ...

  6. layer 确认或取消后跳转

    layer.open({ content: "下单成功" , btn: ['确定','取消'], style: 'width:80%', yes: function(index, ...

  7. [POI2009]Kon

    Description 火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票.求一个查票方案,使得控制的不同的乘客尽量多. (显然对同一 ...

  8. 题解报告:hdu 1503 Advanced Fruits(LCS加强版)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  9. Access OLE对象和附件的区别

    OLE 对象 来自 Office 和基于 Windows 的程序的图像.文档.图形和其他对象 最多可存储 2GB 数据(此大小限制适用于所有 Access 数据库).请记住,添加 2GB 数据会导致数 ...

  10. SimpleDateForma类

    package Format_daqo; import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDa ...