美文网首页
自定义注解的实现和使用

自定义注解的实现和使用

作者: 码而优则仕 | 来源:发表于2020-06-24 13:52 被阅读0次

自定义注解的实现和使用

自定义注解都默认实现Annotation接口,修饰符必须是要public或缺省(为包权限)

属性名的修饰符也必须是要public或缺省(为包权限)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface 注解名称 {
修饰符 返回值 属性名() 默认值;
修饰符 返回值 属性名() 默认值;
}

注解属性(就是上面注解定义中的属性名方法的返回值)支持的类型:

  1. 所有基本数据类型(int float, boolean,double)
  2. String类型
  3. Class类型
  4. 枚举类型
  5. 注解类型
  6. 以上这些类型的数组

注解如果没有程序解析是没有任何作用的

反射相关的类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

相关文章

  • JAVA之自定义注解

    java的基本注解和元注解,不满足条件时可以自定义注解。声明自定义注解使用@interface关键字实现。 根据注...

  • 自定义注解的实现和使用

    自定义注解的实现和使用 自定义注解都默认实现Annotation接口,修饰符必须是要public或缺省(为包权限)...

  • 注解的实现原理

    一、注解的底层实现原理 注解的底层也是使用反射实现的,我们可以自定义一个注解来体会下。注解和接口有点类似,不过申明...

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • SpringBoot之自定义注解(基于BeanPostProce

    步骤使用@interface 自定义注解编写注解处理类,实现BeanPostProcessor接口原理实现Bean...

  • 深入Spring:自定义IOC

    前言 上一篇文章讲了如何自定义注解,注解的加载和使用,这篇讲一下Spring的IOC过程,并通过自定义注解来实现I...

  • Android-自定义注解-Java动态代理(Proxy)-基础

    Android自定义注解从元注解开始,经过自定义注解,经过反射基本可以自己实现一个仿Butterknife那样使用...

  • 反序列化

    JsonSerialize与 JsonDeserialize使用 1、已注解方式使用 2、自定义实现类

  • 一个简单的自定义注解

    1、定义一个自定义注解 2、使用注解 3、利用反射获取注解的值 java注解是怎么实现的?

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

网友评论

      本文标题:自定义注解的实现和使用

      本文链接:https://www.haomeiwen.com/subject/rmerfktx.html