注解属性支持的类型:所有的基本类型(int,float,boolean,byte,double,char,long,short)、 String 类型、 Class类型、Enum类型、Annotation类型、以上所有类型的数组。
我们现在自定义一个注解PersonInfoAnnotation,可以用在字段上,在程序运行时有效,如下:
我们再自定义一个注解CourseInfoAnnotation,该注解可以用在类和方法上,在程序运行时有效,如下:
package demo.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface CourseInfoAnnotation { // 课程名称 public String courseName(); // 课程 标签 public String courseTag(); // 课程简介 public String courseProfile(); // 课程代号 public int courseIndex() default 107; }新创建一个SelfStudyCourse类,在该类上及该类的字段和方法上,使用我们上面的已经定义好了的注解
package demo.annotation; @CourseInfoAnnotation(courseName = "计算机网络",courseTag = "计算机基础", courseProfile = "计算机网络学习的核心内容就是网络协议的学习。" + "网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。" + "因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行") public class SelfStudyCourse { @PersonInfoAnnotation(name = "新一",language = {"Java","C++","Go","Python"}) public String author; @CourseInfoAnnotation(courseName = "Linux 教程",courseTag = "编程基础", courseProfile = "Linux 遵循 GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。" + "由于 Linux 是自由软件,任何人都可以创建一个符合自己需求的 Linux 发行版",courseIndex = 208) public void getCourseInfo(){ } }创建测试类AnnotationDemo,调用上面使用了自定义注解的类的方法,查看运行信息
package demo.annotation; public class AnnotationDemo { public static void main(String[] args) { SelfStudyCourse selfStudyCourse = new SelfStudyCourse(); selfStudyCourse.getCourseInfo(); System.out.println("finish"); } } /** * 运行结果: * finish * 根据运行结果可以看出,在程序中如果不对注解进行处理,和不加注解输出的信息是一致的, * */如果我们不对注解进行处理,那和不加是没有区别的,那我们如何获取注解上得信息呢?通过前面说到得反射,我们查看反射涉及到得几个主要类(Field,Method,Constructor,Class)得源码可以知道,这些跟反射相关得类都实现了AnnotatedElement接口,我们通过查看AnnotatedElement接口的源码,常用的有如下几个方法:
Annotation[] getAnnotations(); // 用来获取对象上的所有注解,包括继承过来的
T getAnnotation(Class annotationClass); // 获取对象上单个指定的注解
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass); //用来判断是否有某个指定的注解