注解

一、内置注解

Java内置了一些常用注解:

1.@Override

该注解修饰一个方法,表示当前类重写了父类的该方法。

2.@Deprecated 

该注解可以修饰类、方法、字段、参数等。表示对应的代码已经过时,不应该被使用。

它是一种警告,不是强制性的。当一个元素被注解为Deprecated时,应该在Java文档中说明替代方案。

3.@SuppressWarnings

该注解表示,压制Java编译器警告,它有一个必填参数表示压制那种类型的警告。

可以修饰大部分代码元素。

二、创建注解

注解的定义,如@SuppressWarnings的定义

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}

元注解:用于定义注解本身

1)@Target:表示注解的目标,其中的ElementType是个枚举,主要可选值有:

TYPE:表示类、接口(包括注解),或者枚举声明;

FIELD:字段、包括枚举常量;

METHOD:方法;

PARAMETER:表示方法参数;

CONSTRUCTOR:构造方法;

LOCAL_VARIABLE:本地变量。

如果没有声明@Target,默认适用于所有类型。

2)@Retention:表示注解信息保留到什么时候,取值只能有一个,类型为RetentionPolicy,

它是一个枚举,取值有:

SOURCE:只保留在源代码中,编译器将代码编译为字节码后文件就会丢掉。

CLASS:保留到字节码文件中,但Java虚拟机将文件加载到内存时不一定会在内存中保留。

RUNTIME:一直保留到运行时。

3)@Document:表示注解信息包含到生成的文档中。

4)@Inherited:例子:

    public class InheritDemo {
@Inherited
@Retention(RetentionPolicy.RUNTIME)
static @interface Test {
}
@Test
static class Base {
}
static class Child extends Base {
}
public static void main(String[] args) {
System.out.println(Child.class.isAnnotationPresent(Test.class)); //true
}
}

注意:与接口和类不同,注解不能被继承。

三、查看注解信息

利用反射机制,我们可以查看和利用注解信息。

Class、Field、Method、Constructor都有如下方法:

//获取所有注解
public Annotation[] getAnnotations()
//获取本元素上直接声明的注解,忽略@Inherited来的
public Annotation[] getDeclaredAnnotations()
//获取指定类型的注解,没有返回null
public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
//判断是否有指定类型的注解
public boolean isAnnotationPresent(
Class<? extends Annotation> annotationClass)

其中Annotation是一个注解,表示接口:

public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
//返回真正的注解类型
Class<? extends Annotation> annotationType();
}

实际上内部实现时,所有的注解类型都是扩展的Annotation。

对于Method和Contructor,它们都有方法参数,而参数也可以有注解,所有它们都有如下方法:

public Annotation[][] getParameterAnnotations()

返回一个二维数组,每个参数对应一个一维数组。

Java笔记(二十) 注解的更多相关文章

  1. Java笔记(二十九)……网络编程

    概述 网络模型 网络通讯的要素 ip地址:网络中设备的标识符 端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口 TCP与UDP UDP特点: ...

  2. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  3. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  4. Java笔记(二十五)……其他常用API

    System类 工具类全部都是静态方法 常用方法 获取系统属性信息 static PropertiesgetProperties() static StringgetProperty(String k ...

  5. Java笔记(二十四)……集合工具类Collections&Arrays

    Collections 集合框架的工具类,方法全部为静态 Collections与Collection的区别 Collection是集合框架的一个顶层接口,里面定义了单列集合的共性方法 Collect ...

  6. Java笔记(二十二)……Collection集合

    概述 为什么会出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式 数组和集合类同是容器,有何不同 数组虽然也可以存储 ...

  7. Java笔记(二十)……线程间通信

    概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...

  8. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  9. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  10. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

随机推荐

  1. Linux基本命令总结(六)

    接上篇: 27,diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输 ...

  2. expansion pattern ‘Frame&’ contains no argument packs

    camera/CameraImpl.h::: error: expansion pattern ‘Frame&’ contains no argument packs void read_fr ...

  3. 休眠(1):sleep和wait的区别

    1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. 2.sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际 ...

  4. 报表工具-ECharts 特性介绍

    ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,S ...

  5. MyBatis使用注意事项

    目录 1. 使用何种映射器配置 2. 对象生命周期和作用域 SqlSessionFactoryBuilder SqlSessionFactory SqlSession 映射器实例(Mapper Ins ...

  6. H5取经之路——CSS基础语法

    一.CSS常用选择器 [选择器的命名规则] * 1.只能有字母数字下划线组成,不能有其他任何字符 * 2.开头不能是数字 [通用选择器] * 1.写法:*{} * 2.选中页面中的所有标签 * 3.优 ...

  7. 获取多<a/>标签id值的点击事件

    <li> <div class="pic"> <c:if test="${userId != null }"> <a ...

  8. Bootstrap3 模态框 select2搜索框无法输入

    <div class="modal fade" role="dialog" aria-hidden="true" data-backd ...

  9. EF6 CodeFirst使用MySql

    如何使用EF CodeFirst连接MySql数据库? 环境:VS2015.Win7..NetFramework4.5.2.MySql5.6 一.基本操作 1.创建MVC5项目:ZmsoftsWebM ...

  10. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程

    Spark2.1.1 一 Spark Submit本地解析 1.1 现象 提交命令: spark-submit --master local[10] --driver-memory 30g --cla ...