优秀文章
博客园:
peida > Annotation的基本概念、自定义注解入门
说明
- 自JDK1.5版本开始引入;
- 只可包含成员变量;
- 本身不会影响程序代码的执行;
- 可以为程序元素(包、类、方法、属性、参数)提供特殊标记(注解),这些标记可嵌入信息(元数据),并且在程序运行时通过反射机制来获取这些信息;
- 元数据(metadata),关于数据的数据;
- 根据注解参数可分:标记注解(无参)、单值注解(单个参数)、完整注解(多个参数);
- 根据注解用途可分:内置注解、元注解(注解的注解)、自定义注解;
系统内置标准注解
- @Override:用于修饰覆盖了父类方法的方法
只可用于方法,若使用该注解的方法确实覆盖了父类的方法,则代码编译正常,若没有,则代码编译报错,常用于判断方法重写; - @Deprecated:用于修饰已经过时的类成员
使用该注解标记的类成员,编译器将不再鼓励使用这个类成员(编译时报警),并且该类成员通过继承被子类获得,同样具备该效果(延续性); - @SuppressWarnnings:用于通知java编译器禁止特定的编译警告
通常用于无法避免警告的程序元素,告诉编译器停止对该元素的警告,SuppressWarnnings注解具备一个String[]的成员,成员中可添加禁止的警告名(编译器会忽略无法识别的警告名);
自定义注解
-
元注解(meta-annotation)
- 说明:JDK1.5中定义了4个标准元注解,元注解与其他注解(内置标准注解除外)不同在于元注解是组成注解的重要组成部分,前者只用作描述(注解)后者,后者被前者描述(注解)才具备实际的注解功能;
- @Target(ElementType):用于描述注解的使用范围
- 使用范围取值(ElementType):
<1>FIELD:用于描述域
<2>PACKAGE:用于描述包
<3>TYPE:用于描述类、接口(包括注解类型) 或enum声明
<5>METHOD:用于描述方法
<6>PARAMETER:用于描述参数
<7>LOCAL_VARIABLE:用于描述局部变量
- @Retention(RetentionPoicy):用于描述注解的有效范围
- 有效范围取值(RetentionPoicy):
<1>SOURCE:在源文件中有效
<2>CLASS:在class文件有效
<3>RUNTIME:在运行时有效
- @Documented:用于声明注解的可识别性
- 说明:注解是不被javadoc等工具处理的,若注解使用@Documented描述,则可被javadoc等工具识别并文档化(生成API);
- @Inherited:用于描述注解的延续性,只作用于类
- 说明:类上的注解是不会被继承的,若注解使用@Inherited描述,则该类注解可以被继承并还可继续被继承;
- 注意:方法上的注解通常是可以被继承的,但是子类若重写了父类的方法,则此方法上的注解则无法继承得到;
- 说明:JDK1.5中定义了4个标准元注解,元注解与其他注解(内置标准注解除外)不同在于元注解是组成注解的重要组成部分,前者只用作描述(注解)后者,后者被前者描述(注解)才具备实际的注解功能;
-
自定义
- 接口:java.lang.annotation.Annotation
- 声明:@interface
- 格式:
@meta-annotation public @interface 注解名 { public type name() default value; }
- 成员可为:所有基本数据类型、String、Class、enum、Annotation、及前面所有类型的数组;
- 默认值:注解成员必须有确定的值,要么在定义时使用默认值,要么在使用时指定值,且非基本类型的成员值不能为null;
-
实例
//使用@Target元注解描述作用范围 @Target(ElementType.TYPE) public @interface TestAnnotation{ //int类型成员 public int intType() default -1; //String类型成员 public String strType() default ""; //enum类型成员 public enum Color{BULE,RED,GREEN}; }
***
####最后
* 通过反射可获取注解信息;
* 注解的存在与否不影响代码的运行,但针对注解设计有效的处理流程可实现注解的价值;
网友评论