一、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(); } }