java_annotation_01
一,Annotation简介
J2SE5.0提供了很多新的我,其中一个很重要的我就是对元数据的支持,在J2SE5.0中,这种元数据被称为注释,通过使用注释,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息.
Annotation可以用来修饰类,属性,方法,而且不影响程序运行,无论是否使用Annotation代码都可以正常进行.
java.lang.annotation.Annotation是Annotation的接口,只要是Annotation都必须实现此接口,此接口定义如下:
public interface Annotation{
public Class<? extends Annotation> annotationType();
public boolean equals(Object obj);
public int hashCode();
String toString();
}
二.系统内建的Annotation
以下讨论到的注解中有一些被称之为Meta注解,它们的目的注解其他注解,并且包含关于其它注解的信息。
- @Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。这是一种元注解,用来标记注解并提供注解的信息。可能的值是:
- SOURCE:表明这个注解会被编译器忽略,并只会保留在源代码中。
- CLASS:表明这个注解会通过编译驻留在CLASS文件,但会被JVM在运行时忽略,正因为如此,其在运行时不可见。
- RUNTIME:表示这个注解会被JVM获取,并在运行时通过反射获取。
- @Target:这个注解用于限制某个元素可以被注解的类型。例如:
- ANNOTATION_TYPE 表示该注解可以应用到其他注解上
- CONSTRUCTOR 表示可以使用到构造器上
- FIELD 表示可以使用到域或属性上
- LOCAL_VARIABLE表示可以使用到局部变量上。
- METHOD可以使用到方法级别的注解上。
- PACKAGE可以使用到包声明上。
- PARAMETER可以使用到方法的参数上
- TYPE可以使用到一个类的任何元素上。
- @Documented:被注解的元素将会作为Javadoc产生的文档中的内容。注解都默认不会成为成为文档中的内容。这个注解可以对其它注解使用。
- @Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。
对于系统内建的3个Annotation这里就不多说了
序号 | Annotation | java中的声明 |
1 | @override |
主要是在方法覆写时使用,用于保证方法覆写的正确性 |
2 | @Deprecated | 主要功能是用来声明一个不建议使用的方法,如果在程序中使用了此方法,则在编译时将出现警告信息 |
3 | @supperssWarning | 主要功能是用来压制警告,例如,进行泛形操作时,如果在类声明时没有指明泛形,则肯定在编译时产生警告,那么此时就可以用这个注释来压制住这种警告. |
三,自定义Annotation(本次学习的重点)
1. 定义简单的Annotation
格式如下:
public @interface Annotation AnnotationName{
数据类型 变量名称();
}
要定义Annotation必须使用@interface的方式进行定义,但是从格式中可以发现,在定义Annotation时也可以定义各种变量,但是变量定义 之后必须带上();
注意:使用@interface就相当于继承了Annotation的接口
例:
public @interface MyAnnotation{ }
其实这就是一个最简单的自定义的接口,其中没有定义任何变量.那么此时如何使用呢?要想使用此Annotation,需要定义其他的类,并使用@Annotationtv很简单
@MyAnnotation
public Class MyAnnotationTest{ }
2.向Annotation中设置内容
定义MyAnnotation可以接收一个变量
public @interface MyAnnotation{
public String value();//接收设置的内容
}
在以上的Annotation中定义了一个value以后在使用此Annotation时,可以将内容设置给value.
例:
@MyAnnotation("wangyang")
public class Demo{}
以上程序在使用Annotation时,向其中设置了一个内容,使用MyAnnotation中定义的value属性进行接收,在使用MyAnnotation时也可以直接指定接收的属性的名称
@MyAnnotation(value="wangyang")
public class Demo{}
以上形式一般只有向一个Annotation中指定多个属性时才会用到
3.在Annotation中设置多少属性
public @interface MyAnnotation{
public String key();
public String value();//接收设置的内容
}
@MyAnnotation(key="wang",value="wangyang")
public class Demo{}
但在现在定义的Annotation中,每次只能向Annotation中的属性传递一个内容,如果要为一个属性设置多个内容,则可以将一个属性定义成一个数组
public @interface MyAnnotation{
public String[] value();
}
@MyAnnotation(value={"wangyang01","wangyang02"})
public class Demo{}
4.在上面的操作中,所有内容都是需要用户在调用Annotation时手工设置的,当然,为了方便用户,有时也可以通过设置默认值的方式减少用户设置的内容
如果在一个定义好的Annotation中已经定义了若干个属性,但是在使用Annotation时并没指定其具体的内容,则在编译时就会出现错误
public @interface MyAnnotation{
public String key();
public String value();//接收设置的内容
}
@MyAnnotation(value="wangyang")
public class Demo{} @MyAnnotation(key="wang")
public class Demo{} @MyAnnotation
public class Demo{}
以上的用法都是错误的
如果我们这样做:
public @interface MyAnnotation{
public String key() default "wang";
public String value() default "wangyang";//接收设置的内容
}
这橛,以后在使用MyAnnotation时,如果没有设置内容,则会将默认值赋予属性,而如果已经明确地给出了内容,则是将给出的内容赋予属性
5.同样我们也可以使用枚举来限制设置的内容
在Annotation中也可以通过枚举来限制Annotation的取值范围
首先我们定义一个枚举:
public enum Color{
BLACK,RED,WHITE;
}
再定义MyAnnotation,此Annotation的取值必须是Color中的类型
public @interface MyAnnotation{
public Color color() default Color.RED; }
这样,以后再使用MyAnnotation时,所有的取值都必须从Color中取
@MyAnnotation(color=Color.RED)
public class Demo{}
四,定义一个完整的Annotation
@Documented
@Retention(value=RUNTIME)
@Ttarget(value=ANNOTATION_TYPE)
public @interface MyAnnotation{
public Color color() default Color.RED; }
注意:
- @Retention:这个注解注在其他注解上,并用来说明如何存储已被标记的注解。这是一种元注解,用来标记注解并提供注解的信息。可能的值是:
- SOURCE:表明这个注解会被编译器忽略,并只会保留在源代码中。
- CLASS:表明这个注解会通过编译驻留在CLASS文件,但会被JVM在运行时忽略,正因为如此,其在运行时不可见。
- RUNTIME:表示这个注解会被JVM获取,并在运行时通过反射获取。
- @Target:这个注解用于限制某个元素可以被注解的类型。例如:
- ANNOTATION_TYPE 表示该注解可以应用到其他注解上
- CONSTRUCTOR 表示可以使用到构造器上
- FIELD 表示可以使用到域或属性上
- LOCAL_VARIABLE表示可以使用到局部变量上。
- METHOD可以使用到方法级别的注解上。
- PACKAGE可以使用到包声明上。
- PARAMETER可以使用到方法的参数上
- TYPE可以使用到一个类的任何元素上。
- @Documented:被注解的元素将会作为Javadoc产生的文档中的内容。注解都默认不会成为成为文档中的内容。这个注解可以对其它注解使用。
- @Inherited:在默认情况下,注解不会被子类继承。被此注解标记的注解会被所有子类继承。这个注解可以对类使用。
java_annotation_01的更多相关文章
随机推荐
- POJ 3468 A Simple Problem with Integers(详细题解) 线段树
这是个线段树题目,做之前必须要有些线段树基础才行不然你是很难理解的. 此题的难点就是在于你加的数要怎么加,加入你一直加到叶子节点的话,复杂度势必会很高的 具体思路 在增加时,如果要加的区间正好覆盖一个 ...
- 图论(网络流,二分图最小点权覆盖):POJ 2125 Destroying The Graph
Destroying The Graph Description Alice and Bob play the following game. First, Alice draws some di ...
- 【动态规划】HDU 5791 Two
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5791 题目大意: A,B两个数列,问A的子集和B的子集相等的子集对数.子集内顺序按照数列顺序,相同的 ...
- HDOJ 2081 手机短号
Problem Description 大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号.假设所有的短号都是是 6+手机号的后5位,比 ...
- kNN
传统的kNN模型 为了获得用户对产品的评分预测值,kNN模型一般包括以下三步: 1.计算相似度 这步中计算每对产品之间的相似度 Person correlation: \[S _ {mn} ^{P} ...
- 【模拟】Class 解题报告
[问题描述] 信息班这期的课将要结束了,老师要从现在班上的同学中选出比较优秀的同学进入下一期的学习.而录取标准则是将平时作业和考试一起考虑,综合成绩排在前面的则录取.经过一番思考,老师作了以下的筛选计 ...
- Java运行环境的配置(JDK和JRE)
Jdk 表示java开发环境,包含开发环境和运行环境 Jre 表示java运行环境 JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发 ...
- java mysql模板
Java mysql的模版,很优雅.同时也兼顾了性能PreparedStatement和安全性(防SQL注入)两方面.对于比较简单的数据库操作基本满足要求. package dao; import j ...
- [置顶] cocos2d-x 植物大战僵尸(4) 帽子僵尸的产生
大家早上好,趁着阳光美好的时候,我打算写下博客:今天要说的是僵尸的产生了,这块和太阳因子的产生比较相似,大体上的区别在于僵尸的基类这块:我在考虑是详细的写还是大体的写,本着对自己作业的态度和 ...
- 分享一个linux和linux的文件传输【scp无密码传输】
很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...