自定义注解的实现和使用
自定义注解都默认实现Annotation接口,修饰符必须是要public或缺省(为包权限)
属性名的修饰符也必须是要public或缺省(为包权限)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface 注解名称 {
修饰符 返回值 属性名() 默认值;
修饰符 返回值 属性名() 默认值;
}
注解属性(就是上面注解定义中的属性名方法的返回值)支持的类型:
- 所有基本数据类型(int float, boolean,double)
- String类型
- Class类型
- 枚举类型
- 注解类型
- 以上这些类型的数组
注解如果没有程序解析是没有任何作用的
反射相关的类Class,Constructor,Method,Field都实现了注解相关的接口 AnnotatedElement
AnnotatedElement接口定义的方法:
//指定类型的注解是否存在在指定元素上
default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
return getAnnotation(annotationClass) != null;
}
//获取对象上的单个注解
<T extends Annotation> T getAnnotation(Class<T> annotationClass);
//获取元素上的所有注解,包括对象继承过来的注解
Annotation[] getAnnotations();
default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) {
default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
Annotation[] getDeclaredAnnotations();
自定义注解类:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseInfoAnnotation {
//课程名称
public String courseName();
//课程标签
public String courseTag();
//课程简介
public String courseProfile();
//课程序号
public int coursIendex() default 303;
}
/**
* 不能继承或实现任何接口或类,注解
* 作用在类的成员变量上
* 在程序运行是使用
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonInfoAnnotation {
//名字的属性 public 获取缺失可以,protected private 不行
public String name();
//年龄 给个默认值
public int age() default 19;
//性别
public String gender() default "男";
//编程语言
public String[] language();
}
@CourseInfoAnnotation(courseName = "注解学习", courseTag = "基础"
, courseProfile = "学习注解全面知识")
public class YunsCourse {
@PersonInfoAnnotation(name = "wsq", language = {"Java", "C++"})
private String author;
@CourseInfoAnnotation(courseName = "Java基本知识学习", courseTag = "常识"
, courseProfile = "学习框架必须的知识")
public void getCourseIpublic class AnnotationParser {
//解析类的注解
public static void parseTypeAnnotation() throws Exception {
Class target = Class.forName("com.yuns.demo.annotation.YunsCourse");
System.out.println("=====获取类上注解=======");
Annotation[] annotations = target.getAnnotations();
for (Annotation annotation : annotations) {
CourseInfoAnnotation courseInfoAnnotation = (CourseInfoAnnotation) annotation;
System.out.println("课程名称 :" + courseInfoAnnotation.courseName());
System.out.println("课程标签 :" + courseInfoAnnotation.courseTag());
System.out.println("课程简介 :" + courseInfoAnnotation.courseProfile());
System.out.println("课程序号 :" + courseInfoAnnotation.coursIendex());
}
}
//解析成员变量的注解
public static void parseFieldAnnotation() throws Exception {
Class target = Class.forName("com.yuns.demo.annotation.YunsCourse");
System.out.println("=====获取成员变量上的注解=======");
Field[] fields = target.getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(PersonInfoAnnotation.class)) {
PersonInfoAnnotation personInfoAnnotation = (PersonInfoAnnotation) field.getAnnotation(PersonInfoAnnotation.class);
System.out.println("姓名 :" + personInfoAnnotation.name());
System.out.println("年龄 :" + personInfoAnnotation.age());
System.out.println("精通语言 :" + personInfoAnnotation.language());
System.out.println("性别 :" + personInfoAnnotation.gender());
}
}
}
//解析成员方法的注解
public static void parseMethodAnnotation() throws Exception {
Class target = Class.forName("com.yuns.demo.annotation.YunsCourse");
System.out.println("=====获取成员方法上的注解=======");
Method[] methods = target.getDeclaredMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(CourseInfoAnnotation.class)) {
CourseInfoAnnotation courseInfoAnnotation = (CourseInfoAnnotation) method.getAnnotation(CourseInfoAnnotation.class);
System.out.println("课程名称 :" + courseInfoAnnotation.courseName());
System.out.println("课程标签 :" + courseInfoAnnotation.courseTag());
System.out.println("课程简介 :" + courseInfoAnnotation.courseProfile());
System.out.println("课程序号 :" + courseInfoAnnotation.coursIendex());
}
}
}
public static void main(String args[]) throws Exception {
parseTypeAnnotation();
parseFieldAnnotation();
parseMethodAnnotation();
}
}
nfo() {
}
}
执行结果如下:
=====获取类上注解=======
课程名称 :注解学习
课程标签 :基础
课程简介 :学习注解全面知识
课程序号 :303
=====获取成员变量上的注解=======
姓名 :wsq
年龄 :19
精通语言 :[Ljava.lang.String;@5a07e868
性别 :男
=====获取成员方法上的注解=======
课程名称 :Java基本知识学习
课程标签 :常识
课程简介 :学习框架必须的知识
课程序号 :303
Process finished with exit code 0
网友评论