注解

一、内置注解

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()

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

最新文章

  1. 利用NSCalendar类实现日期的比较
  2. Java String.split()
  3. 详解 ASP.NET异步
  4. breakpoints
  5. 如何为PHP贡献代码
  6. Windows系统中IIS 6.0+Tomcat服务器环境的整合配置过程
  7. MySQL命令记录1
  8. JQuery 操作input
  9. flash跨域策略文件crossdomain.xml配置详解
  10. html块级元素与行内元素
  11. Mybatis 元素内容必须由格式正确的字符数据或标记组成
  12. Selenium及Headless Chrome抓取动态HTML页面
  13. 翻译:CONCURRENT INSERTS(已提交到MariaDB官方手册)
  14. Word转MD文件
  15. MYSQL的索引和常见函数
  16. 联想服务器thinkserver rd650安装 windows server 2008 r2
  17. Ruby入门(1)——windows下Ruby开发环境搭建
  18. [AIR] AS3读取本地文件夹中的文件
  19. gitlab仓库服务器搭建
  20. 使用QuartZ.net来做定时计划任务 ; 值不能为 null。 参数名: assemblyString

热门文章

  1. gcc __thread关键字
  2. 网页三剑客之JS
  3. Java异常知识整理_处理异常时的性能开销
  4. ZooKeeper-API CURD
  5. ArcMap修改粘滞移动容差防止要素在选择时无意拖动移动
  6. China-global view
  7. [物理学与PDEs]第1章第5节 Maxwell 方程组的数学结构, 电磁场的波动性 5.3 电磁场的波动性, 自由电磁波
  8. 循环语句(for,while,do……while),方法概述
  9. apt-get本地软件源搭建
  10. NB-IoT不一定最完美 但足以成为决定ofo与摩拜物联网胜负的关键【转】