当前位置: 首页 > news >正文

Java高级-注解

注解

  • 1.介绍
  • 2.元注解
  • 3.注解的解析
  • 4.注解的应用场景

1.介绍

注解 Annotation

  • 就是Java代码里的特殊标记,作用是让其他程序根据注解信息来决定什么是执行该程序
  • 注解:注解可以在类上、构造器上、方法上、成员变量上、参数上等位置

自定义注解

/*** 自定义注解*/
public @interface MyTest1 {String aaa();boolean bbb() default true;String[] ccc();
}

特殊属性名:value

  • 如果注解中只有一个vlue属性,使用注解时,value名称可以不写
public @interface MyTest2 {String value(); // 特殊属性
}

注解的原理

  • 注解本质是一个接口,Java中所有的注解都是继承了Annotation接口的
  • @注解(…): 其实就是一个实现类对象,实现了该注解以及Annotation接口
    在这里插入图片描述

2.元注解

元注解

  • 指的是:修饰注解的注解
  • @Target 声明被修饰的注解在哪些位置使用
    • 类,成员变量,成员方法,成员参数,构造器,局部变量
  • @Retention 声明注解的保留周期
    • SOURCE 只作用在源码阶段,字节码文件中不存在
    • CLASS (默认值)保留到字节码文件阶段,运行阶段不存在
    • RUNTIME (开发常用)一直保留到运行解阶段

3.注解的解析

什么是注解的解析

  • 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解

  • 指导思想:要解析谁上面的注解,就应该先拿到谁
  • 比如要解析类上面的注解,则应该先获取该类的Class对象,在通过Class对象解析其上面的注解
  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
  • Class、Method、Field、Constructor 都实现了AnnotatedElement接口,都拥有解析注解的能力
    在这里插入图片描述

案例
先定义注解MyTest4

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {String value();double aaa() default 100;String[] bbb();
}

在Demo类中定义test1方法,在类和方法上使用MyTest4的注解

@MyTest4(value = "蜘蛛精", aaa = 991, bbb = {"Java", "Python"})
public class Demo {@MyTest4(value = "孙悟空", aaa = 22, bbb = {"HTML", "CSS"})public void test1() {}
}

在AnnotationTest3测试类上,解析Demo类中的全部注解

public class AnnotationTest3 {@Testpublic void parseClass() throws NoSuchMethodException {// 1.先得到Class对象Class demoClass = Demo.class;// 2.解析类上的注解// 判断类上是否包含了某个注解if (demoClass.isAnnotationPresent(MyTest4.class)) {MyTest4 myTest4 = (MyTest4) demoClass.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}// 3.解析方法上的注解Method test1 = demoClass.getDeclaredMethod("test1");if (test1.isAnnotationPresent(MyTest4.class)) {MyTest4 myTest4 = test1.getDeclaredAnnotation(MyTest4.class);System.out.println(myTest4.value());System.out.println(myTest4.aaa());System.out.println(Arrays.toString(myTest4.bbb()));}}
}

4.注解的应用场景

案例:模拟Junit框架
需求:定义若干个方法,只有加了MyTest注解,就会触发该方法执行
分析:

  1. 定义一个自定义注解MyTest,只能注解方法,存放范围是一直都在
  2. 定义若干个测试方法,部分方法加上@MyTest注解,部分方法不加
  3. 模拟Junit程序,可以触发加了@MyTest注解的方法执行
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}public class AnnotationTest4 {public void test1() {System.out.println("==test1==");}@MyTestpublic void test2() {System.out.println("==test2==");}public void test3() {System.out.println("==test3==");}@MyTestpublic void test4() {System.out.println("==test4==");}public static void main(String[] args) throws Exception {// 1.获取对象Class annotationTest4Class = AnnotationTest4.class;// 2.获取所有方法Method[] methods = annotationTest4Class.getDeclaredMethods();// 3.遍历所有方法AnnotationTest4 annotationTest4 = new AnnotationTest4();for (Method method : methods) {// 4.判断如果存在MyTest注解if (method.isAnnotationPresent(MyTest.class)) {// 5.存在MyTest注解,执行该方法method.invoke(annotationTest4);}}}
}
http://www.lryc.cn/news/171374.html

相关文章:

  • wabp.m 代码注释(便于算法快速理解)
  • 数据库数据恢复-SQL SERVER数据库文件损坏的故障表现数据恢复方案
  • flink中cpu消耗的大户-序列化和反序列化
  • 使用 K 均值聚类进行颜色分割
  • Redis 哈希表操作实战(全)
  • element table合并行或列 span-method
  • 【操作系统笔记】内存分配
  • Web 整合
  • hasOwnProperty 方法解析
  • 使用 nohup 运行 Python 脚本
  • Django:五、登录界面实现动态图片验证码
  • GPT,GPT-2,GPT-3,InstructGPT的进化之路
  • firefox_dev_linux下载安装配置(部分系统自带包请看结尾)
  • vim缓存-交换文件
  • Hive 优化建议与策略
  • CentOS 7.5 centos failed to load selinux policy 错误解决方法
  • 注入之SQLMAP(工具注入)
  • Linux学习资源Index
  • 什么是SVG(可缩放矢量图形)?它与普通图像格式有何不同?
  • 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows
  • React TypeScript 定义组件的各种方式
  • 互联网摸鱼日报(2023-09-20)
  • AWS入列CNCF基金会
  • 岭回归与LASSO回归:解析两大经典线性回归方法
  • 数学建模——微分方程介绍
  • Minio入门系列【7】Spring Boot集成Minio
  • 抖音视频下载.py(23年9月份可用)
  • 项目基本搭建流程
  • 学习pytorch11 神经网络-非线性激活
  • Jenkins学习笔记2