JavaSE-23 注解
学习要点
- 注解的概念
- 注解分类
- 读取注解信息
注解概述
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 注解的更多相关文章
- 用大白话聊聊JavaSE -- 自定义注解入门
注解在JavaSE中算是比较高级的一种用法了,为什么要学习注解,我想大概有以下几个原因: 1. 可以更深层次地学习Java,理解Java的思想. 2. 有了注解的基础,能够方便阅读各种框架的源码,比如 ...
- Java匹马行天下之JavaSE核心技术——注解
Java注解 一.什么是注解 注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器.开发工具和其他程序可以通过反射来 ...
- JavaSE25-Junit&注解
1.Junit单元测试 1.1 测试分类 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具体的执行流程. Junit使用:白盒测试 步骤: ...
- Java枚举类、注解和反射
本文主要介绍的是枚举类,注解和反射.还有一些基础知识:static,基本数据类型,运算符优先级放在文中,以便查阅复习. 其中牵扯到泛型的部分,可参考本人的另一篇博客:(Collection, List ...
- java枚举和注解
枚举 一.枚举(enumeration) 是一组常量的集合,可以理解为:枚举属于一种特殊的类,里面只包含一组有限的特定的对象,构造方法默认为private. 二.枚举的两种实现方式 1.自定义实现枚举 ...
- JAVA $ JSP
1. java中数据类型分为两种 基本数据类型:数值型,字符型,布尔型 引用数据类型:类,接口,数组 基本数据类型所占空间固定,有别与C++,java中没有无符号数byte:1字节short: ...
- Java中的各种o
java的po vo dao dto pojo 1各个术语的简介 PO(persistant object)持久对象 最形象的理解就是一个PO就是数据库中的一条记录.PO是在ORM中出现的概念,就是O ...
- JSON在各种语言中的运用
1. JSON数据格式 JSON(JavaScript Object Notation) 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的strin ...
- Java匹马行天下之新手学习目录
Java匹马行天下之新手学习目录 学习路线 [Java匹马行天下——Java学习路线] [Java匹马行天下——开篇学习计划] 基础篇 [Java匹马行天下之学编程的起点——编程常识知多少] [Jav ...
- JavaSE学习总结(十五)—— Java反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
随机推荐
- 并不对劲的bzoj4560:p3269:[JLOI2016]字符串覆盖
题目大意 \(T\)(\(T\leq10\))组询问 每组询问给出一个字符串\(A\)(\(|A|\leq10^4\)),\(n\)(\(n\leq4\))个\(A\)的子串\(B_1,B_2,B_3 ...
- AutoIT: WinGetText的作用
WinGetText是一个非常有用的函数,可以获取页面上一切可见的资源,这为自动化测试的验证功能提供了保证.可以使用一些字符串处理函数来对获取来的页面文本进行分析. If StringInStr(Wi ...
- 协程的优点(Python)
协程的优点: 协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间, 而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.协程的执行效率非常高.因为子程序切换 ...
- TensorFlow博客翻译——用TensorFlow在云端进行机器学习
https://github.com/tensorflow/tensorflow 原文地址 Machine Learning in the Cloud, with TensorFlow Wednesd ...
- 11.2NOIP模拟赛
/* 根右左遍历后最长上升子序列 */ #include<iostream> #include<cstdio> #include<cstring> #include ...
- 强连通分量初探 By cellur925
并不理解.但是毕竟也做了一些题,略微小结. 注:这里讨论的暂时是有向图的强联通分量. 先贴出模板.学长:我也不理解,但我可以叫你们怎么背代码. #include<cstdio> #incl ...
- 《Windows核心编程系列》十一谈谈Windows线程池
Windows线程池 上一篇博文我们介绍了IO完成端口.得知IO完成端口可以非常智能的分派线程.但是IO完成端口仅对等待它的线程进行分派,创建和销毁线程的工作仍然需要我们自己来做. 我们自己也可以创建 ...
- 扩展KMP的应用
扩展KMP的应用: 给出模板串S和串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0<=i<Slen),求出S[i..Slen-1]与T的 最长公共前缀长度,记为e ...
- shell 调试 2例
1.############# #!/bin/ksh if [ ! -z $TNS_ADMIN ]; then export TNS_ADMIN=`dirname $TNS_ADMIN` ...
- JUnit单元测试&注解
①测试方法上必须使用@Test进行修饰 ②测试方法必须使用public void 进行修饰,不能带任何的参数 ③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开 ④测试类所在的包 ...