Annotation简介
来源:互联网 发布:excel sql建立数据库 编辑:程序博客网 时间:2024/06/07 11:46
1 解释
Java的annotation,可以附加在package, class, method, field等上面,相当于给它们添加了额外的辅助信息。如果没有外部解析工具等对其加以解析和处理的情况,本身不会对Java的源代码或class等产生任何影响,也不会对它们的执行产生任何影响。
但借助外部工具,可以对annotation进行解析,做出相应的处理,比如运行时改变对象/方法的行为。
Annotation从java语义上提供元数据的支持。
什么是元数据(metadata)呢?
Metadata是描述数据本身的数据。
2 示例
2.1 场景描述
有一个不学无术的孩子,整日游手好闲,用时下流行的话来形容我觉得最恰当不过,那就是“吃老一族”,依仗着父母现在还能蹦跶,自己好吃懒做无所事事,有一天突然看到台湾呕像歌星菜10的演唱会海报,此时他就准备让老爸帮他倒腾一张贵宾票观看演出,要知道菜10的演唱会贵宾票那是相当难买了,但是老爸为了成全儿子,还是通过各种渠道想尽办法帮他料理,老爸找到了主办单位,经过一番金钱的沟通,最终人家愿意让他的儿子以贵宾的待遇参加演唱会,可是他儿子还不愿意主动的找到主办方亮出自己的身份,他的意思就是自己一进演出现场就要有服务人员识别自己贵宾的身份(都懒到什么程度了),无奈,经过老爸与主办方的一再思考,最后主办方灵机一动,我们可以给他一张卡,只要他带上这个卡,我们就会认出他来,这个卡就是“败家子”卡,到时候让他戴在胸前,父亲大赞此计甚妙!回家之后就给他儿子说了,当然他儿子也就以败家子贵宾的身份观看了演出,在进站口,检票人员一眼就找见了“败家子”并且经过牌号他刚好是“250”,如此幸运,除了享受贵宾待遇之外他还获得了其他的待遇。
2.2 代码实现
1、annotation:VIP
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)//生命周期,即,在哪个阶段保留。SOURCE、CLASS、RUNTIME
@Target(ElementType.TYPE)//限定Annotation所修饰的对象范围
public @interface VIP {
String value();
}
2、model:BlackSheep
@VIP("250")
public class BlackSheep {
public void attend(){
System.out.println("观看演出");
}
}
3、主办方:Main
public class Main {
public static void main(String[] args){
//创建一个败家子
BlackSheep aBlackSheep = new BlackSheep();
if (aBlackSheep.getClass().isAnnotationPresent(VIP.class)) {
System.out.println("败家子来了");
}
aBlackSheep.attend();//肯定是可以观看演出的
}
}
3 Jdk自带的annotation
l @Deprecated 相当于Javadoc的@deprecated,被@Deprecated标注的对象class, method等被注明为不推荐使用。主要用于javac等编译工具。
l @Override 注明对象method重载了父类的方法。javac等编译工具编译时会根据此Annotation判断重载方法是否正确。
l @SuppressWarnings 告诉javac等编译器忽略所指定的特定的警告信息。
l @Target被定义的annotation可以附加在那些对象上。
l @Retention annotation的作用期间
…
4 语法
4.1 修饰符
与java类不同,annotation的修饰符是:@interface
示例:修饰符
public @interface MyAnnotation {
}
4.2 元annotation:meta-annotation
被用来声明annotation类型的annotation
4.2.1 生命周期@Retention
使用注解@Retention标识annotation的生命周期
值
描述
CLASS
annotation信息将被编译器编译时保存在class文件中,但执行时不会在VM装载。也就是说不能在执行时动态取得annotation信息。未设置@Retention时这将是默认设置值。
RUNTIME
annotation信息将被编译器编译时保存在class文件中,执行时也会被VM装载。
SOURCE
annotation信息将被编译器编译时舍弃掉。
示例: @Retention
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
4.2.2 使用范围@Target
使用注解@Target标识annotation可以附加在那些元素上
值
描述
备注
ANNOTATION_TYPE
应用于其他注解的元注解
CONSTRUCTOR
构造函数
FIELD
字段
LOCAL_VARIABLE
方法中的本地变量
不推荐使用
METHOD
方法
PACKAGE
包
PARAMETER
方法的参数
TYPE
类,接口或者枚举声明
示例: @Target
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
4.2.3 是否可继承@Inherited
子类是否可继承父类的annotation
如果子类不重写(Override)使用了@Inherited的注解的方法,则会继承注解内容;
如果子类重写(Override)了该方法,则对应的注解同样会被覆盖掉
4.3 属性/方法
4.3.1 语法:类型 名称();
示例: 属性/方法
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
4.3.2 使用
略。
5 Annotation拓展
如果可以通过扩展annotation为已有的类添加额外的功能,这样功能都封装在annotation里,不是很爽么?
虽然,会让代码不容易读,但只要约定、文档都描述清楚,且测试到位,这样的功能还是很爽的!
那么怎么做呢?
参考:http://www.blogjava.net/freeman1984/archive/2010/05/05/320110.html
- Annotation简介
- Annotation简介
- Annotation简介
- Hibernate annotation 使用简介
- java annotation 注释 简介
- JAX-RS Annotation 简介
- Hibernate Annotation简介
- Java Annotation简介
- Java Annotation简介
- Spring基于 Annotation 简介
- java annotation简介
- Java注解Annotation简介
- Java annotation简介1
- Java annotation简介2
- 1.5中的annotation简介
- <context annotation-config />简介
- Java Annotation注解 简介
- Java1.5中的annotation简介
- 开源动画库nineoldandroids的使用
- 文章标题
- 互斥锁
- 32位与64位系统各个变量所占空间大小
- linux 如何把一个目录配置到系统路径PATH中?
- Annotation简介
- 清华大学计算机考研的相关信息,
- 蓝桥杯算法训练——最大最小公倍数(贪心)
- registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later
- ubuntu下gedit中文乱码问题
- OpenCV例子四:摄像头实时人脸检测
- 动态改变ActionBar中Menu
- TCP/IP详解笔记(6)
- POJ2752Seek the Name, Seek the Fame(KMP)