Java注解的定义和使用
注解也叫元数据,一种代码级别的说明。是jdk1.5后产生的一个特性,与类、接口、枚举同一个档次,他可以在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释;
<!--more-->
注解分类
编写文档:通过代码里的标识的注解生成文档(生成word文档)
编译检查:通过代码里的标识的注解让编译器能够实现基本的编译检查
代码分析:通过代码里标识的注解对的代码进行分析(使用反射) 【重点】
注解可以在类、变量、方法、接口上使用
注解也有生命周期
一个方法上、一个变量上、一个类上,可以使用多个注解
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注解的定义和使用的更多相关文章
- Java注解(二):实战 - 直接使用对象列表生成报表
通过对Java注解(一):介绍,思想及优点学习了解,相信大家对Java注解有一定程度的了解,本篇文章将实战项目中的应用来加深对Java注解的了解. 本实例实现根据指定字段的JavaBean,生成对应列 ...
- java反射--注解的定义与运用以及权限拦截
自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是 ...
- Java注解与自己定义注解处理器
动机 近期在看ButterKnife源代码的时候.竟然发现有一个类叫做AbstractProcessor,并且ButterKnife的View绑定不是依靠反射来实现的,而是使用了编译时的注解,自己主动 ...
- JAVA中如何定义自定义注解
了解注解 注解是Java1.5,JDK5.0引用的技术,与类,接口,枚举处于同一层次 .它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释 . 在Java中,自带 ...
- (转)秒懂,Java 注解 (Annotation)你可以这样学 ---- 重要 注解定义与反射解析
转:http://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人 ...
- Java开发学习(十)----基于注解开发定义bean 已完成
一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies> <dependency> < ...
- Java自定义注解的定义与使用
Java注解 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...
- 了解java注解
类似于下面这样的就是注解 注解可以在类上,成员变量上,方法上等 假如有2个注解是这样的:(其中的Author和Date) 那么这2个注解的定义就是这样的: Author注解: Date注解: 可以看到 ...
- Java注解
Java注解其实是代码里的特殊标记,使用其他工具可以对其进行处理.注解是一种元数据,起到了描述.配置的作用,生成文档,所有的注解都隐式地扩展自java.lang.annotation.Annotati ...
随机推荐
- ubuntu16.04-交叉编译opencv3.4.6
0.前言 在要移植opecv和SeetaFaceEngine-master到ARM板子上运行的所有步骤之前,有几点需要注意的: 查看板子运行的Kernel版本 交叉编译工具链的gcc版本,关键就是工具 ...
- SK-learn实现k近邻算法【准确率随k值的变化】-------莺尾花种类预测
代码详解: from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split fr ...
- js 一个或多个一维数组,算出元素之间相互组合的所有情况
// 数据源 var target = { state1: ['1', '2'], state2: ['01', '02', '03'], state3: ['001','002'] } stackS ...
- 手把手教你使用Python爬取西刺代理数据(下篇)
/1 前言/ 前几天小编发布了手把手教你使用Python爬取西次代理数据(上篇),木有赶上车的小伙伴,可以戳进去看看.今天小编带大家进行网页结构的分析以及网页数据的提取,具体步骤如下. /2 首页分析 ...
- 批量查询PDF文本并导出结果的小工具
效果: 批量查询指定关键字 & 指定目录下PDF文件中的文本,并导出文件路径和关键字所在文本行. 下载: 链接: https://pan.baidu.com/s/1sK2OMMgGX26l7P ...
- PHP扩展Swoole的代码重载机制
大家都知道Swoole的性能在PHP界还算不错,同样都是PHP为什么呢,我专门研究了下. 几个概念: 1) sapi:可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互 ...
- htaccess 一般配置
一.Apache服务器 <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on Rewr ...
- 2019-2020-1 20199325《Linux内核原理与分析》第七周作业
第七周作业 1.进程描述符task_struct数据结构(一) 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct数据结构很 ...
- Java ASM3学习(3)
MethodVisitor ClassVisitor的visitMethod能够访问到类中某个方法的一些入口信息,那么针对具体方法中字节码的访问是由MethodVisitor来进行的 访问顺序如下,其 ...
- QT bug ig9icd64.dll
QT bug ig9icd64.dll bugintel ig9icd64.dll 处有未经处理的异常 遇到了一个 奇奇怪怪的bug, 一般的QT程序中 在main.cpp 中初始化一个窗口进行显示后 ...