Java从零开始学四十七(注解简述)
一、Java中注解Annotation
什么是注解:用来描述数据的数据(元数据)。
Java代码里的特殊标记。它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某一个时刻方便的使得这些注解修饰的程序元素。
作用:
用将由编译器来测试和验证的格式,存储有关程序额外信息
生成 描述符文件,甚至是新的类定义
减轻编写模板代码的负担
使代码更加干净易读
注解和注释不同
注解与普通的代码注释有一定的区别,也有一定的联系。注解和注释都属于对代码的描述;
注释的作用只是简单的描述程序的信息,它不会被程序所读取;
注解则是Java代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理
通过使用注解,程序开发人员可以在不改变原有逻辑的情况下在源文件中嵌入一些补充的信息,代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者部署。
二、注解语法
使用注解时要在基前面加“@” 符号,同时将注解作为修饰符使用
所有的注解都继承了java.lang.annotation包下的Annotation接口
注解语法规范
- 将注解放在所有修饰符之前
- 通常将注解单独放置在一行
- 默认情况下,注解可用于修饰任何元素,包括类,方法,成员,变量等。
三、注解类型
内建注解(也称为基本注解),定义于java.lang包下
- 限定重写父类方法:@Override
- 标示已经过时:@Deprecated
- 抑制编译器警告:@SupperssWarnings
元注解(Meta Annotation)
- @Retention
- @Target
- @Documented
- @Inherited
自定义注解
使用@interface自定义注解

@Override

@Override只能用于修饰方法,而不能修饰其它的元素。
@Deprecated注解
private String name;
private String pwd; //标示这个属性已经过时,会在这个属性或者方法 名上加上删除线
@Deprecated
private int age;
@Deprecated
public String getName() {
return name;
}

@SuppressWarnings
@SuppressWarnings("unused")
public static void main(String[] args) {
//没有定义泛型
@SuppressWarnings("rawtypes")
List list=new ArrayList();

四、元注解
元注解用来修饰其它的注解位于java.lang.annotation下
元注解(Meta Annotation)
- @Retention:用于指定被修饰的注解可以保留多长时间,包含一个RetentionPolicy类型的value成员变量,使用Retetion时必须为该value成员变量指定值

- @Target:有唯一的value作为成员变量,value的类型为java.lang.annotation.ElementType[]是被标注的枚举类型


- @Documented:用于指定被修饰的注解将被javadoc工具提取成文档,没有成员变量
- @Inherited:用于指定被修改的注解将具有继承性
五、自定义注解
使用@interface 关键字
注解类型和接口的相似之处
都可以定义常量,静态成员(如枚举类型定义)。注解类型也可以像接口一样被实现或者被继承

package com.pb.annotation.diy; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
*自定义注解需要使用@interface关键字
*
*/
//设置注解可以为javadoc获取为帮助文档
@Documented
/*
* @Retention有如下参数(注解的生命周期)
* RetentionPolicy.SOURCE:注解被编译器丢弃
* RetentionPolicy.CLASS:注解保存在class类当中,被虚拟机忽略
* RetentionPolicy.RUNTIME:注解被保存在class类当中,被虚拟机读取
* */
@Retention(RetentionPolicy.RUNTIME)
/*
* target 有如下参数:
* TYPE : 注解目标是类、接口
* FIELD: 注解目标是字段
* METHOD:注解目标是方法
* PARAMETER:注解目标是方法的参数
* CONSTRUCTOR:注解目标是构造函数
* LOCAL_VARIABLE:注解目标是局部变量
* */
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
/*
* 可以被继承
*/
@Inherited
public @interface MyAnnotation {
//设置注解成员变量并赋初始值
String name() default "张三";
int age() default 21; }
读取注解信息

package com.pb.annotation.diy;
import java.lang.annotation.Annotation;
public class MyAnnotationTest {
@MyAnnotation(name="Jack",age=32)
public void getInfo(){
try {
//获取当前getInfo()方法中包含的所有注解
@MyAnnotation
Annotation [] annos=MyAnnotationTest.class.getMethod("getInfo").getAnnotations();
//注解数组
for (Annotation an : annos) {
if(an instanceof MyAnnotation){
System.out.println("an 是"+an);
System.out.println("注解中的name:"+((MyAnnotation) an).name());
System.out.println("注解中的age:"+((MyAnnotation) an).age());
}
}
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyAnnotationTest mt=new MyAnnotationTest();
mt.getInfo();
}
}
Java从零开始学四十七(注解简述)的更多相关文章
- Java从零开始学四十一(反射简述二)
一.实例化Class类对象 实例化Class类对象的方法有三种: 第一种:通过forName()方法 第二种:类.class 第三种:对象.getClass() 二.Class类的常用方法 No. 方 ...
- Java从零开始学四十(反射简述一)
一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- Java从零开始学四十四(多线程)
一.进程与线程 1.1.进程 进程是应用程序的执行实例. 进程是程序的一次动态执行过程,它经历了从代码加载.执行到执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程 特征: 动态 ...
- Java从零开始学四十二(DOM解析XML)
一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...
- Java从零开始学三十七(JAVA IO- 二进制文件读写)
一.简述 二.使用步骤 DataInputStream: 引入相关的类 构造数据输入流的对象(如:FileInputStream,BufferedWriter包装后读取文件等) 读取二进制文件的数据 ...
- Java从零开始学四十三(DOM4j解析XML)
一.创建XML // 建立XML public static void gernatorXML() { // 创建Document对象 Document doc = DocumentHelper.cr ...
- Java从零开始学二十七(NumberFormat类)
一.NumberFormat表示数字的格式化类 NumberFormat表示数字的格式化类,即:可以按照本地的风格习惯进行数字的显示. No. 方法 类型 描述 1 public static Loc ...
- Java从零开始学四(数据类型)
一.Java数据类型划分 二.基本数据类型 No. 数据类型 大小/位 可表示的数据范围 1 long(长整数) 64 -9223372036854775808 ~ 92233720368547758 ...
随机推荐
- ruby -- 基础学习(六)时间计算
计算下一天的这个时刻, # 比如"2013-8-16 18:45:12" 的下一天的这个时刻 “2013-8-17 18:45:12” Time.now + 1.day 如果想得到 ...
- 将STM32的标准库编译成lib
转载自:http://www.cnblogs.com/zyqgold/p/3189719.html 以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程. 这 ...
- gulp-clean----gulp系列(五)
前面说过,当css,img,js出现删除操作的时候,虽然watch会监听,但是并不会删除相应文件. 现在实现clean任务,执行任务前先删除一次build目录. 先配置JS任务,设置删除目录. 在系列 ...
- Python - 属性简介"__name__"
模块是对象,并且每个模块都有一个内置属性__name__.当一个模块被直接运行的时候,该模块__name__的值就等于缺省的'__main__'.如果一个模块被import ,那么这个被引入模块__n ...
- 轻松认识JVM运行时数据区域(使用思维导图)
下面是个人阅读周志明编写的深入浅出Java虚拟机做成思维导图的笔记,线条.颜色和图片的视觉印象比起单纯文字笔记好得太多了,文字笔记的枯燥以及硬性记忆我就不再多说,特别对于JVM这块略微有点枯燥的知识, ...
- mysql一个事务中有DDL语句的binlog情况
在autocommit=1的情况下,开启一个事务,如果里面有DDL语句,那么事务开始到DDL语句之间的DML语句都会被提交.再开启新的事务.可以从binlog中看出 session语句: 09 ...
- 点餐APP 冲刺一总结
在冲刺一的过程中,我们小组每个人的任务相对来说都比较轻松,完成的进度也比较快, 主要的原因是每个人分配的任务都比较明确,大家也很积极地去完成.当然啦,我们在实现 项目的过程中也遇到了一些麻烦,主要是最 ...
- P6 EPPM R16.1安装与配置指南(一)
标题 http://www.cnblogs.com/endv/p/5634620.html 安装与配置指南安装与配置指南(数据库)说明哪些How to set up the P6专业数据库和服务器.a ...
- 重构第28 天 重命名bool方法(Rename boolean method)
详解:本文中的”为布尔方法命名”是指如果一个方法带有大量的bool 参数时,可以根据bool 参数的数量,提取出若干个独立的方法来简化参数. 理解: 我们现在要说的重构并不是普通字面意义上的重构,它有 ...
- 安卓使ScrollView滚动到底部代码
在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom ...