注解的初识在自动生成重写诸如equals()等方法时头顶的那个@Override,还有消除那黄黄的警告线时的@SuppressWarnings,当时只是感受无关紧要的东西,对它就像只是看待一个不知道哪儿定义的一个方法而已。java
以后感受它的神奇就是在项目使用框架时了。学习框架时用的xml配置,已经感受挺有创意了,并无学习annotation,在一次实际项目开发中,hibernate,spring,springMVC统统注解。那简洁的xml配置和一行代码顶数句的注解更是感到神气的不行(xml与注解各有好处,非是误导注解必定强于xml),而后才对注解另眼相看,准备多学习一些。spring
我的信息
注解出生时间在jdk 1.5版本。地位呢,他是一个类型,地位同于class(类),interface(接口),固然还有一个平级可是和它同样不是很是常见的类型:enmu(枚举)。数据库
项目经历
Hibernate中,用注解能够实现字段与数据库列的映射。api
Spring中注解更是用着舒服,不管是Io仍是AOP的配置,使用注解效率比起xml配置都是快捷不少。并且也是在框架学习时较多的使用注解,发现注解的强大。也由此以为再使用的基础上应该有一些进一步的了解。数组
其余框架中如Junit 4版本开始后也是注解@Test代替了命名规则,数不胜数,相信在以后开发中,注解会被越来多的使用。框架
技能分类ide
注解有三种类型工具
package java.lang; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
如上代码,这是源码中的@Override
代码,这个其实就是个自定义注解(我的想法),只不过是jdk本身写的,因此他就是内置注解。
其中有两行学习
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE)
这儿的@Target
和@Retention
就是元注解。固然不止这两个。测试
具体的定义以及参数的解释在API文档或者源码【帮您找好】中
java.lang.annotation
包均可以很明确的了解。包括内置注解均可以直接看jdk中的具体实现。
实践
在文档或jdk中元注解以及内置注解自定义都有源码参考,所以再须要了解的即是自定义注解。
自定义注解有三个:
@interface
,他于注解就至关于class于一个类,用@interface
声明要定义的是一个注解,后面跟的天然是注解名称了。注解参数类型:
- 全部基本数据类型(int,float,boolean,byte,double,char,long,short)
- String、Class、enum、Annotation类型
- 以上全部类型的数组
举个栗子:
//1. 定义两个注解 StuId(用来讲明学号) StuSex(用来定义性别) @Target(ElementType.FIELD)//做用于字段上 @Retention(RetentionPolicy.RUNTIME)//保留到运行期 public @interface StuId{ /**此处定义成员也就是用注解时要传递的相似于参数的玩意,指定了默认值,使用时能够不写字段值 *不然必须写:如 @StuId(stuId = "0001") *若是是单一属性 通常声明为 String value(); *这样在使用时能够简写为 @StuId("0001") */ String stuId() default "000";//使用时能够 @StuId 字段值会取默认值000 } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface StuSex{ public enum sex{ 男,女; } sex stuSex() default sex.男; } //2. 使用注解(房子写个"拆") public class Student{ //给字段注值应该在set方法上,字段上破坏了封装性,此处无视~ @StuId(stuId = "0001") private String stuId; @StuSex(stuSex = sex.女) private String stuSex; //...省略getter和setter } //3. 处理注解(出动挖掘机...) public static void getStuInfo(Class<?> clazz){ Field[] fields = clazz.getDeclaredFields(); for(Field field :fields){ //找出其中是StuId类型的注解 if(field.isAnnotationPresent(StuId.class)){ StuId stuId = (StuId) field.getAnnotation(StuId.class); System.out.println("学号:"+stuId.stuId()); } //找出其中是StuSex类型的注解 else if(field.isAnnotationPresent(StuSex.class)){ StuSex stuSex= (StuSex) field.getAnnotation(StuSex.class); System.out.println("性别:"+stuSex.stuSex()); } } } //如上注解已经完成,下来测试: public class Test { public static void main(String[] args) { DellStu.getStuInfo(Student.class); } } 输出结果: 学号:0001 性别:女 //回看 2.注解使用 ,若是是这样,不写字段值 @StuId(stuId = "0001") private String stuId; @StuSex(stuSex = sex.女) private String stuSex; //那么输出结果(注解定义时设置的默认值): 学号:000 性别:男
我的评价 通常状况下是用不到本身去实现一个注解的,只有开发框架什么的大牛们才会用到(为了给我这菜鸟用...),可是仍是有必要简单了解一些。