• Java自定义注解


    概述

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。

    在这里插入图片描述

    注解的作用
    对Java中类、方法、成员变量做标记,然后进行特殊处理,至于到底做何种处理由业务需求来决定。

    例如:JUnit框架中,标记了注解@Test的方法就可以被当成测试方法执行,而没有标记的就不能当成测试方法执行。

    自定义注解

    使用方法

    自定义注解就是自己做一个注解来使用。

    格式
    在这里插入图片描述

    注意
    value属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写,但是如果有多个属性, 那么没有默认值的属性必须写明。

    代码示例

    public @interface MyBook {
        String name();
        String[] authors();
        double price();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @MyBook(name="《精通JavaSE》",authors = {"黑马", "dlei"} , price = 199.5)
    public class AnnotationDemo1 {
    
        @MyBook(name="《精通JavaSE2》",authors = {"黑马", "dlei"} , price = 199.5)
        private AnnotationDemo1(){
    
        }
    
        @MyBook(name="《精通JavaSE1》",authors = {"黑马", "dlei"} , price = 199.5)
        public static void main(String[] args) {
            @MyBook(name="《精通JavaSE2》",authors = {"黑马", "dlei"} , price = 199.5)
            int age = 21;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    元注解

    就是注解的注解。

    元注解有两个
    @Target: 约束自定义注解只能在哪些地方使用;
    @Retention:申明注解的生命周期;

    在这里插入图片描述
    代码示例

    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Bookk {
        String value();
        double price() default 100;
        String[] author();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注解解析

    方法

    注解的操作中经常需要进行解析,注解的解析就是判断是否存在注解,存在注解就解析出内容。

    与注解解析相关的接口
    Annotation: 注解的顶级接口,注解都是Annotation类型的对象;
    AnnotatedElement:该接口定义了与注解解析相关的解析方法;

    方法说明
    Annotation[] getDeclaredAnnotations()获得当前对象上使用的所有注解,返回注解数组
    T getDeclaredAnnotation(Class<T> annotationClass)根据注解类型获得对应注解对象
    boolean isAnnotationPresent(Class<Annotation> annotationClass)判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

    所有的类成分Class, Method , Field , Constructor,都实现了AnnotatedElement接口他们都拥有解析注解的能力

    解析注解的技巧

    注解在哪个成分上,我们就先拿哪个成分对象。

    1. 注解作用成员方法,则要获得该成员方法对应的Method对象,再来拿上面的注解;
    2. 注解作用在类上,则要该类的Class对象,再来拿上面的注解;
    3. 注解作用在成员变量上,则要获得该成员变量对应的Field对象,再来拿上面的注解;

    代码示例

    在这里插入图片描述
    Bookk.java

    @Target({ElementType.TYPE,ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Bookk {
        String value();
        double price() default 100;
        String[] author();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    AnnotationDemo3.java

    public class AnnotationDemo3 {
        @Test
        public void parseClass(){
            // a.先得到类对象
            Class c = BookStore.class;
            // b.判断这个类上面是否存在这个注解
            if(c.isAnnotationPresent(Bookk.class)){
                //c.直接获取该注解对象
                Bookk book = (Bookk) c.getDeclaredAnnotation(Bookk.class);
                System.out.println(book.value());
                System.out.println(book.price());
                System.out.println(Arrays.toString(book.author()));
            }
        }
    
        @Test
        public void parseMethod() throws NoSuchMethodException {
            // a.先得到类对象
            Class c = BookStore.class;
    
            Method m = c.getDeclaredMethod("test");
    
            // b.判断这个类上面是否存在这个注解
            if(m.isAnnotationPresent(Bookk.class)){
                //c.直接获取该注解对象
                Bookk book = (Bookk) m.getDeclaredAnnotation(Bookk.class);
                System.out.println(book.value());
                System.out.println(book.price());
                System.out.println(Arrays.toString(book.author()));
            }
        }
    }
    
    @Bookk(value = "《情深深雨濛濛》", price = 99.9, author = {"琼瑶", "dlei"})
    class BookStore{
    
        @Bookk(value = "《三少爷的剑》", price = 399.9, author = {"古龙", "熊耀华"})
        public void test(){
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    注解应用:模拟junit

    Junit单元测试框架详解

    需求
    定义若干个方法,只要加了MyTest注解,就可以在启动时被触发执行。

    分析

    1. 定义一个自定义注解MyTest,只能注解方法,存活范围是一直都在;
    2. 定义若干个方法,只要有@MyTest注解的方法就能在启动时被触发执行,没有这个注解的方法不执行;

    MyTest.java

    @Target({ElementType.METHOD,ElementType.FIELD}) // 元注解
    @Retention(RetentionPolicy.RUNTIME) // 一直活着,在运行阶段这个注解也不消失
    public @interface MyTest {
    }
    
    • 1
    • 2
    • 3
    • 4

    AnnotationDemo4.java

    public class AnnotationDemo4 {
        public void test1(){
            System.out.println("===test1===");
        }
    
        @MyTest
        public void test2(){
            System.out.println("===test2===");
        }
    
        @MyTest
        public void test3(){
            System.out.println("===test3===");
        }
    
        /**
          启动菜单:有注解的才被调用。
         */
        public static void main(String[] args) throws Exception {
            AnnotationDemo4 t = new AnnotationDemo4();
            // a.获取类对象
            Class c = AnnotationDemo4.class;
            // b.提取全部方法
            Method[] methods = c.getDeclaredMethods();
            // c.遍历方法,看是否有MyTest注解,有就跑它
            for (Method method : methods) {
                if(method.isAnnotationPresent(MyTest.class)){
                    // 跑它
                    method.invoke(t);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    React报错之Type ‘() => JSX.Element[]‘ is not assignable to type FunctionComponent
    Map集合概述和一般使用
    redis进阶:集群模式原理及搭建
    halcon学习和实践(颜色筛选)
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    LeetCode 283. 移动零
    板块一 Servlet编程:第三节 HttpServletRequest对象全解与请求转发 来自【汤米尼克的JAVAEE全套教程专栏】
    Vue中如何进行本地存储(LocalStorage)
    【微服务】Day12(搜索功能、Quartz)
    创建计划协议、维护创建计划、收货
  • 原文地址:https://blog.csdn.net/weixin_52341477/article/details/125535361