第十八节:第七部分:java高级:注解的应用场景:模拟junit框架

什么是注解的解析以及如何解析注解

代码:

解析注解的案例

代码:

MyTest2(注解)

java 复制代码
package com.itheima.day10_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 MyTest2 {
    String value();
    double aaa() default 100;
    String[] bbb();
}

Demo

java 复制代码
package com.itheima.day10_annotation;
@MyTest2(value = "蜘蛛精",aaa = 99.5,bbb = {"至尊宝","黑马"})
public class Demo {
    @MyTest2(value = "孙悟空",aaa = 99.9,bbb = {"紫霞","牛夫人"})
    public void test1(){

    }
}

AnnotationTest2(主程序)

java 复制代码
package com.itheima.day10_annotation;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Arrays;

/*
* 目标:掌握注解的解析(解析类上的注解、解析方法上的注解)。
* */
public class AnnotationTest2 {
    @Test
    public void parseClass() {
        // 1、先得到Class对象
        Class c = Demo.class;
        // 2、解析类上的注解
        // 判断类上是否包含了某个注解
        if (c.isAnnotationPresent(MyTest2.class)) {
            MyTest2 mytest2 =
                    (MyTest2) c.getDeclaredAnnotation(MyTest2.class);
            System.out.println(mytest2.value());
            System.out.println(mytest2.aaa());
            System.out.println(Arrays.toString(mytest2.bbb()));

        }

    }

    @Test
    public void parseMethod() throws Exception {
        // 1、先得到Class对象
        Class c = Demo.class;
        Method m = c.getDeclaredMethod("test1");
        //解析方法上的注解
        // 判断方法对象上是否包含了某个注解
        if (m.isAnnotationPresent(MyTest2.class)) {
            MyTest2 mytest2 =
                    (MyTest2) m.getDeclaredAnnotation(MyTest2.class);
            System.out.println(mytest2.value());
            System.out.println(mytest2.aaa());
            System.out.println(Arrays.toString(mytest2.bbb()));

        }
    }
}

模拟Junit框架的案例

MyTest(注解)

java 复制代码
package com.itheima.day10_annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)// 注解只能注解方法。
@Retention(RetentionPolicy.RUNTIME)//让当前注解可以一直存活着。
public @interface MyTest {
    
}

AnnotationTest3(主程序)

java 复制代码
package com.itheima.day10_annotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
* 目标:模拟Junit框架的设计。
* */
public class AnnotationTest3 {
    //@MyTest
    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 {
        AnnotationTest3 a = new AnnotationTest3();
        //启动程序!
        // 1、得到Class对象
        Class c = AnnotationTest3.class;
        //2、提取这个类中的全部成员方法
        Method[] methods = c.getDeclaredMethods();
        // 3、遍历这个数组中的每个方法,看方法上是否存在@MyTest注解,存在
        //  触发该方法执行。
        for (Method method : methods) {
            if (method.isAnnotationPresent(MyTest.class)) {
                //说明当前方法上是存在@MyTest,触发当前方法执行
                method.invoke(a);
            }
        }

    }
}
相关推荐
2401_87969387几秒前
用Python批量处理Excel和CSV文件
jvm·数据库·python
java1234_小锋2 分钟前
Java高频面试题:Spring-AOP通知和执行顺序?
java·开发语言·spring
番茄去哪了6 分钟前
Java基础面试题day02
java·开发语言·面向对象编程
gjc59220 分钟前
踩坑实录:MySQL服务器CPU爆高,元凶竟是SELinux的setroubleshootd?
运维·服务器·数据库·mysql·adb
我是咸鱼不闲呀22 分钟前
力扣Hot100系列22(Java)——[图论]总结(岛屿数量,腐烂的橘子,课程表,实现Trie(前缀树))
java·leetcode·图论
1104.北光c°22 分钟前
深入浅出 Elasticsearch:从搜索框到精准排序的架构实战
java·开发语言·elasticsearch·缓存·架构·全文检索·es
2401_8463416523 分钟前
Python Lambda(匿名函数):简洁之道
jvm·数据库·python
2401_8796938726 分钟前
进阶技巧与底层原理
jvm·数据库·python
知识分享小能手27 分钟前
Redis入门学习教程,从入门到精通, Redis Stack 完整语法知识点及使用指南(7)
数据库·redis·学习
MSTcheng.28 分钟前
【优选算法必修篇——位运算】『面试题 01.01. 判定字符是否唯一&面试题 17.19. 消失的两个数字』
java·算法·面试