目前java开发已经趋向于使用注解开发,包括我们最熟悉的框架spring,已经从xml过度到了annotation,而现在最流行的微服务springcloud是基于springboot开发的一套微服务解决方案。其中的springboot的配置文件已经不复存在,而是使用配置类,配置类中使用了大量的annotation。可见annotation在开发中的重要性!
创建自定义注解
要创建一个自定义注解,是十分简单的,类似于我们之前写的接口。只是在接口中添加一个@字符,就可以创建一个注解类。
@Retention(RetentionPolicy.RUNTIME) //声明周期,运行时期也有注解 。参数说明:1、source:源码时期,仅仅保留在源码阶段。2、class:Class阶段,即保留到java编译器将源代码解析为.class阶段3、Runtime:jvm将Class字节码加载到内存阶段,即反射阶段可以使用
@Target(ElementType.TYPE) //作用在某个类中。说明:java中class 可以看成某个类,interface可以看成某个类,Enum可以看成某个类,@interface可以看成某个类
public @interface MyAnnotation {
}
注意:
- 我们创建的自定义注解,就跟我们创建一个Class一样,因此可以把它理解为一种类,java的的类使用Type,它可以表示Class,Annotation,Enum,interface。
- @Retention(RetentionPolicy.RUNTIME) 表示的是这个注解的声明周期,一个注解对象的生命周期有三种类型SOURCE,CLASS,RUNTIME,其中souce表示注解的的生命周期为源码阶段,class表示注解的生命周期为jvm把源代码编译成.class阶段,runtime表示注解的生命周期为jvm把.class文件加载到内存中(要使用反射,需要将注解的生命周期声明为runtime)
- @Target(ElementType.TYPE) 表示的是注解作用的范围,比如作用在字段Field,Class,注解,方法等
使用自定义的注解
因为我们的自定义注解的作用范围是Type,表示可以作用在类上。
package com.cony.annotation.demo01;
/**
* @author Kang
* @date 2018年4月20日 上午8:46:58
* @desciption:
*/
@MyAnnotation
public class Person {
private String userName;
private Integer age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
简单的测试
package com.cony.annotation.demo01;
/**
* @author Kang
* @date 2018年4月20日 上午8:49:56
* @desciption:
*/
public class PersonTest {
public static void main(String[] args) {
Person person=new Person();
if(person.getClass().isAnnotationPresent(MyAnnotation.class)){//当调用getClass()的时候jvm会把.class字节码加载到内存中,而MyAcnnotation的生命周期是runtime,所以这里为true
MyAnnotation annotation = person.getClass().getAnnotation(MyAnnotation.class);
System.out.println(annotation);
}
}
}