Java自定义注解
一、注解:
我们可以通过定义注解,使用注解来方便地调用某些数据。
二、java内建注解:
比如@override、@deprecated等,重写方法时会使用@override,而当某些类或方法已经被摒弃时则会出现 @deprecated
三、元注解:
元注解的作用就是负责注解其他注解。
包括@Target、@Inherited、@Retention、@Documented
@Target:表明Annotation的使用范围,包括类、方法、属性等
@Inherited:表明父类的注解可以被子类继承
@Retention:指定Annation的存在范围
@Documented:在生成java doc时可以写入文档说明
其中,Target范围如下:
而Retention范围如下:
四、自定义Annotation
Annotation用@interface来定义.
格式如下:
public @interface Annotation 名称{ 修饰符 数据类型 变量名称(); }
也可以在定义时直接用default指定默认值。
五、解析Annotation
而想取得Annotation的值,需要使用反射机制。
解析Annotation的相关api如下所示:
示例如下:
MyAnnotation.java :
import java.lang.annotation.Documented; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Inherited @Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE}) //表示该注解,既可以用到字段上,也可以用到类上面。 @Documented public @interface MyAnnotation { public String name(); public String job() default "programer"; }
Person.java :
@MyAnnotation(name = "lin") public class Person {
//getter 、 setter }
AnnotationTest.java :
/** 通过反射获取Annotations的值 */ public class AnnotationTest { public static void main(String[] args) throws Exception { Class<?> personClass=Person.class;
//判断Person类上面,有没有MyAnnotation.class这个注解
if(personClass.isAnnotationPresent(MyAnnotation.class)) {
//获取注解
MyAnnotation annotation=personClass.getAnnotation(MyAnnotation.class);
String name=annotation.name();
String job=annotation.job();
System.out.println("name:"+name);
System.out.println("job:"+job);
} } }
参考资料:
《java开发实战经典》