注解也叫元数据,一种代码级别的说明。是jdk1.5后产生的一个特性,与类、接口、枚举同一个档次,他可以在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释

<!--more-->

注解分类

  1. 编写文档:通过代码里的标识的注解生成文档(生成word文档)

  2. 编译检查:通过代码里的标识的注解让编译器能够实现基本的编译检查

  3. 代码分析:通过代码里标识的注解对的代码进行分析(使用反射) 【重点】

注解可以在类、变量、方法、接口上使用

注解也有生命周期

一个方法上、一个变量上、一个类上,可以使用多个注解

JDK中内置的注解

  • @Deprecated:用来修饰已经过时的方法。编译期注解,提示该方法或者该成员变量已经过期,不建议使用,但是还是能使用的,会在使用到该方法 或者该变量会有个横线,能用到(类、变量、方法)

  • @Override:用来修饰此方法重写了父类的方法 只能在方法上

  • @SuppressWarnings:用来通知java编译器禁止特定的编译警告

    @SuppressWarnings("unused")

自定义注解

通过@interface 关键字进行定义

public @interface 注解名称{

}

使用注解、在类上使用的列子

@注解名称
public class Test {

}

元注解

元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其他的注解上面。

元注解有@Retention、@Documented、@Target、@Inherited、@Repeatable这5个

两个类型一样的注解不能同时用

@Retention【重点】

Retention 意思是保留期的意思,当@Retention应用到一个注解上的时候,它解释说明了这个注解的存活时间

取值如下:

描述
RetentionPolicy.SOURCE 注解只在源代码阶段博保留,在编译器进行编译时将会被丢弃忽视
RetentionPolicy.CLASS 只被保留在编译进行的时候,并不会加载到JVM中
RetentionPolicy.RUNTIME 可以保留到程序运行时,它会被加载到JVM中,所以可以获取到他们

RetentionPolicy是一个枚举类

代码演示:

@Retention(RetentionPolicy.RUNTIME)//定义一个运行期有效的注解
public @interface MyAnnotation {
}

@Target【重点】

目标的意思,@Target指定注解运用的地方

  • ElementType.ANNOTATION_TYPE:可以给注解进行注释

  • ElementType.CONSTRUCTOR:可以给构造方法注解

  • ElementType.FIELD:可以给属性进行注解

  • ElementType.LOCAL_VARIABLE:可以给局部变量进行注解

  • ElementType.METHOD:可以给方法进行注解不能用在构造方法上

  • ElementType.PACKAGE:可以给包进行注解

  • ElementType.PARAMETER:可以给一个方法内的参数进行注解

  • ElementType.TYPE;可以给一个类型进行注解,比如类、接口、枚举

代码实例:

//该注解可在 类 接口、枚举、方法、成员变量使用
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@MyAnnotation
public class Student {
   @MyAnnotation
   int age;
   @MyAnnotation
   public void test() {
  }
}

@Inherited

表示该注解能被子类使用(继承)

注解MyAnnotation被@Inherited修饰,如果有个类A使用了@MyAnnotation注解,又有一个子类b继承了A,在b中也能使用@MyAnnotation注解

@Documented

这个注解和文档有关,它能将注解中的元素包含到Javadoc中

@Repeatable

在需要对同一个注解多次使用在一个类、接口、方法、属性等上面的时候,需要用@Repeatable

注解的属性

注解的属性也叫成员变量,注解中只有成员变量,无成员方法

注解的成员变量在注解的定义以无参数的方法的形式来声明。其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型

@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
public @interface MyAnnotation {
   //注解中只有成员变量,无成员方法
   int id() default 0;
   String username() default " ";
}

这里的default给该变量id和username设置了默认值

在Student类中用了该注解的方法可以给该注解中的变量赋值,如果注解没有设置默认值,则在引用该注解的时候必须给该注解赋值

public class Student {
   @MyAnnotation(id = 12, username ="小飞龙" )
   int age;
   @MyAnnotation
   public void test01() {
  }
   @MyAnnotation(id = 55)
   public void test02() {
  }

}

当注解中只有一个变量的时候(也就是只有一个无参方法的时候)可以这样写

注解中的代码:

public @interface MyAnnotation {
//注解中只有成员变量,无成员方法
String value() default " ";
}

Student代码:

public class Student {
@MyAnnotation("张三")
public void test01() {
}
// @MyAnnotation(value = "李四")等价 @MyAnnotation("张三")
@MyAnnotation(value = "李四")
public void test02() {
}
}

在这里@MyAnnotation(value = "李四")等价    @MyAnnotation("张三"),都是给value赋值

Java注解的定义和使用的更多相关文章

  1. Java注解(二):实战 - 直接使用对象列表生成报表

    通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...

  2. java反射--注解的定义与运用以及权限拦截

    自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...

  3. Java注解与自己定义注解处理器

    动机 近期在看ButterKnife源代码的时候.竟然发现有一个类叫做AbstractProcessor,并且ButterKnife的View绑定不是依靠反射来实现的,而是使用了编译时的注解,自己主动 ...

  4. JAVA中如何定义自定义注解

    了解注解 注解是Java1.5,JDK5.0引用的技术,与类,接口,枚举处于同一层次 .它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释 . 在Java中,自带 ...

  5. (转)秒懂,Java 注解 (Annotation)你可以这样学 ---- 重要 注解定义与反射解析

    转:http://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片.  这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人 ...

  6. Java开发学习(十)----基于注解开发定义bean 已完成

    一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies>    <dependency>        < ...

  7. Java自定义注解的定义与使用

    Java注解 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...

  8. 了解java注解

    类似于下面这样的就是注解 注解可以在类上,成员变量上,方法上等 假如有2个注解是这样的:(其中的Author和Date) 那么这2个注解的定义就是这样的: Author注解: Date注解: 可以看到 ...

  9. Java注解

    Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...

随机推荐

  1. thinkphp5--关于多条件查询的分页处理问题

    首先,我们要想搞明白,我们的分页参数起作用的原理: 正在使用的时候的语法: if(!empty($seach)){ $where['user_name|mobile'] = ['like','%'.$ ...

  2. php内置函数call_user_func()

    <?php //call_user_func(callback,name,age) //第一个参数callback作为回掉函数使用,其余的参数是他的参数 function now($a,$b) ...

  3. Service Location Protocol SLP

    https://www.ibm.com/developerworks/cn/linux/l-slp/ 服务发现(service discovery) 是在网络环境中发现必须使用的服务的能力.例如,如果 ...

  4. docker企业级镜像仓库Harbor管理

    Harbor概述 Harbor是由VMWare公司开源的容器镜像仓库.事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括: ...

  5. 咦,Java拆分个字符串都这么讲究

    提到 Java 拆分字符串,我猜你十有八九会撂下一句狠话,"这有什么难的,直接上 String 类的 split() 方法不就拉到了!"假如你真的这么觉得,那可要注意了,事情远没这 ...

  6. 【Linux常见命令】tar命令

    [独立命令,只能用其中一个,和别的命令连用]这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个. -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末 ...

  7. 从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择

    背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...

  8. 用两张图告诉你,为什么你的App会卡顿?

    有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...

  9. DeepWalk论文精读:(1)解决问题&相关工作

    模块1 1. 研究背景 随着互联网的发展,社交网络逐渐复杂化.多元化.在一个社交网络中,充斥着不同类型的用户,用户间产生各式各样的互动联系,形成大小不一的社群.为了对社交网络进行研究分析,需要将网络中 ...

  10. 第十届山东省赛L题Median(floyd传递闭包)+ poj1975 (昨晚的课程总结错了,什么就出度出度,那应该是叫讨论一个元素与其余的关系)

    Median Time Limit: 1 Second Memory Limit: 65536 KB Recall the definition of the median of elements w ...