• Java高级-注解


    注解(Annotation)

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

    自己定义注解

    • 特殊属性名:value

    • 如果注解中只有一个value属性,value名称可以不写

    注解的原理

    • 注解本质是一个接口,该接口继承了Annotation接口
    • 使用@注解名(....):其实就是一个实现类对象,实现了该注解以及Annotation接口。

    元注解

    • 修饰注解的注解称为元注解
    • @Target

      • 作用:声明被修饰的注解只能在哪些位置使用
        1. @Target(ElementType.TYPE,ElementType.FIELD)
        2. 1.Type,类,接口
        3. 2.FIELD,成员变量
        4. 3.METHOD,成员方法
        5. 4.PARAMETER,方法参数
        6. 5.CONSTRUCTOR,构造器
        7. 6.LOCAL_VARIABLE,局部变量
    • @Retention

      • 作用:声明注解的保留周期
        1. @Retention(RetentionPolicy.RUNTIME)
        2. 1.SOURCE,只作用在源码阶段,字节码文件中不存在
        3. 2.CLASS(默认值),保留到字节码文件阶段,运行阶段存在
        4. 3.RUNTIME(开发常用),一直保留到运行阶段

    注解的解析

    • 什么是注解解析

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

    • 核心思想:要解析谁上面的注解,就应该先拿到谁。
      • 比如:要解析类上面的注解,则应该先获取该类的Class对象,在通过Class对象解析其上面的注解
      • 比如:要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。
      • Class、Method、Field、Constructor都实现了AnnotatedElement接口,他们都拥有解析注解的能力
        • AnnotatedElement接口提供解析注解的方法说明
          public Annotation[ ] getDeclaredAnnotations()获取当前对象上面的注解
          public T getDeclaredAnnotation(Class annotationClass)获取指定注解对象
          public boolean isAnnotationPresent(Class annotationClass)判断当前对象是否存在某个注解

    案例

    • 解析注解的案例,具体要求如下
      • 1.定义注解MyTest4,要求如下
        • 包含属性:String value()
        • 包含属性:double aaa(),默认值为100
        • 包含属性:String [ ] bbb()
        • 限制注解的使用位置:类和成员变量方法上
        • 指定注解的有效范围:一直到运行时
            1. package com.example.Anno;
            2. import java.lang.annotation.ElementType;
            3. import java.lang.annotation.Retention;
            4. import java.lang.annotation.RetentionPolicy;
            5. import java.lang.annotation.Target;
            6. @Target({ElementType.TYPE, ElementType.METHOD})
            7. @Retention(RetentionPolicy.RUNTIME)
            8. public @interface MyTest4 {
            9. String value();
            10. double aaa() default 100;
            11. String[] bbb();
            12. }
      • 2.定义一个类叫:Demo,在类中定义一个test1方法,并在该类和其方法上使用MyTest4注解
          1. package com.example.Test;
          2. import com.example.Anno.MyTest4;
          3. @MyTest4(value = "蜘蛛精", bbb = {"至尊宝", "紫霞仙子"}, aaa = 99.5)
          4. public class Demo {
          5. @MyTest4(value = "蜘蛛精1", bbb = {"至尊宝1", "紫霞仙子1"}, aaa = 199.5)
          6. public void test1() {
          7. }
          8. }
      • 3.定义一个TestAnnotation测试类,解析Demo类中全部注解
          1. package com.example.Test;
          2. import com.example.Anno.MyTest4;
          3. import org.junit.Test;
          4. import java.lang.annotation.Annotation;
          5. import java.lang.reflect.Method;
          6. public class TestAnnotation {
          7. @Test
          8. public void parseClass() {
          9. // 1.先得到Class对象
          10. Class c = Demo.class;
          11. // 2.解析类上的注解
          12. // 判断该类上是否包含某个注解
          13. if (c.isAnnotationPresent(MyTest4.class)) {
          14. MyTest4 myTest4 = (MyTest4) c.getDeclaredAnnotation(MyTest4.class);
          15. System.out.println(myTest4.value());
          16. System.out.println(myTest4.aaa());
          17. System.out.println(myTest4.bbb());
          18. }
          19. }
          20. @Test
          21. public void parseMethod() throws NoSuchMethodException {
          22. // 1.先得到Class对象
          23. Class c = Demo.class;
          24. Method method = c.getDeclaredMethod("test1");
          25. // 2.解析方法上的注解
          26. // 判断该方法上是否包含某个注解
          27. if (method.isAnnotationPresent(MyTest4.class)) {
          28. MyTest4 myTest4 = method.getDeclaredAnnotation(MyTest4.class);
          29. System.out.println(myTest4.value());
          30. System.out.println(myTest4.aaa());
          31. System.out.println(myTest4.bbb().toString());
          32. }
          33. }
          34. }

    注解的应用场景

    • 配合反射等技术来构建框架
    • 案例

      • 定义若干个方法,只要加了MyTest注解,就会触发该方法执行
    • 分析
      • 1.定义一个自定义的注解MyTest,只能注解方法,存活范围是一直都在
          1. package com.example.Anno;
          2. import java.lang.annotation.ElementType;
          3. import java.lang.annotation.Retention;
          4. import java.lang.annotation.RetentionPolicy;
          5. import java.lang.annotation.Target;
          6. // todo 自定义注解
          7. @Target(ElementType.METHOD)
          8. @Retention(RetentionPolicy.RUNTIME)
          9. public @interface MyTest {
          10. }
      • 2.定义若干个方法,部分方法加上@MyTest注解修饰,部分方法不加
      • 3.模拟一个Junit程序,可以触发加了@MyTest注解的方法执行
          1. package com.example.Test;
          2. import com.example.Anno.MyTest;
          3. import java.lang.reflect.InvocationTargetException;
          4. import java.lang.reflect.Method;
          5. public class TestAnnotation {
          6. @MyTest
          7. public void test1() {
          8. System.out.println("test1---");
          9. }
          10. public void test2() {
          11. System.out.println("test2---");
          12. }
          13. public void test3() {
          14. System.out.println("test2---");
          15. }
          16. public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
          17. TestAnnotation testAnnotation = new TestAnnotation();
          18. // 启动程序
          19. // 1.得到Class对象
          20. Class c = TestAnnotation.class;
          21. // 2.提取类中的全部方法
          22. Method[] declaredMethods = c.getDeclaredMethods();
          23. // 3.遍历数组中的每个方法,然后查看方法是否含有@MyTest注解
          24. for (Method declaredMethod : declaredMethods) {
          25. if (declaredMethod.isAnnotationPresent(MyTest.class)) {
          26. declaredMethod.invoke(testAnnotation);
          27. }
          28. }
          29. }
          30. }

  • 相关阅读:
    强化学习-task2
    Android | ArcGIS入门
    企业多点组网最直接、最简单的方案是什么?
    HTML + CSS 高频考点之 - 定位
    udp接收队列以及多次初始化的测试
    【Linux】学习记录_17_网络编程
    基于SpringBoot+Vue的疫苗接种管理系统
    还在用Navicat?这款开源的数据库管理工具界面更炫酷!
    服务器怎么买,腾讯云服务器购买三种流程介绍
    python+大数据校园卡数据分析 计算机竞赛
  • 原文地址:https://blog.csdn.net/weixin_64939936/article/details/133174700