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

Android 使用自定义注解标注当前类

使用自定义注解标注当前类

    • 举个例子
      • 1. 自定义注解`FragmentSetting`
      • 2. 抽象基类`BaseFragment`
      • 3. 具体的`Fragment`类
      • 4. 测试类
    • 自定义注解是如何定义的

举个例子

1. 自定义注解FragmentSetting

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface FragmentSetting {
    String path();
    String group();
}

2. 抽象基类BaseFragment

public abstract class BaseFragment {
    private String path;
    private String group;

    public BaseFragment() {
        FragmentSetting annotation = this.getClass().getAnnotation(FragmentSetting.class);
        if (annotation!= null) {
            this.path = annotation.path();
            this.group = annotation.group();
        }
    }

    public String getPath() {
        return path;
    }

    public String getGroup() {
        return group;
    }
}

3. 具体的Fragment

@FragmentSetting(path = "/home", group = "main")
public class HomeFragment extends BaseFragment {
}

@FragmentSetting(path = "/settings", group = "config")
public class SettingsFragment extends BaseFragment {
}

4. 测试类

public class Main {
    public static void main(String[] args) {
        HomeFragment homeFragment = new HomeFragment();
        System.out.println("HomeFragment - Path: " + homeFragment.getPath());
        System.out.println("HomeFragment - Group: " + homeFragment.getGroup());

        SettingsFragment settingsFragment = new SettingsFragment();
        System.out.println("SettingsFragment - Path: " + settingsFragment.getPath());
        System.out.println("SettingsFragment - Group: " + settingsFragment.getGroup());
    }
}

在这个示例中:

  • FragmentSetting注解用于标注Fragment类,包含pathgroup属性。
  • BaseFragment抽象类在构造函数中通过反射获取FragmentSetting注解的值,并提供getPathgetGroup方法来获取这些值。
  • HomeFragmentSettingsFragment是具体的Fragment类,使用FragmentSetting注解标注,它们继承自BaseFragment,可以直接使用getPathgetGroup方法。
  • main方法中创建了HomeFragmentSettingsFragment的实例,并输出它们的pathgroup信息。

自定义注解是如何定义的

  1. 定义语法基础
    • 在Java中,自定义注解是通过@interface关键字来定义的。例如,public @interface MyAnnotation就定义了一个名为MyAnnotation的注解。
    • 注解本质上是一种特殊的接口,它的成员变量(也称为元素)默认是publicstaticfinal的。
  2. 元注解的使用
    • @Target
      • 这个元注解用于指定自定义注解可以应用的目标元素类型。例如
      • @Target(ElementType.TYPE)表示该注解可以用于类、接口、枚举等类型定义上;@Target(ElementType.METHOD)表示注解可以用于方法上;
      • @Target(ElementType.FIELD)表示可用于成员变量(字段)上。它的参数是ElementType枚举类型的值,这个枚举包含了多种元素类型,如TYPEMETHODFIELDPARAMETER(方法参数)、CONSTRUCTOR(构造方法)等。
    • @Retention
      • 用于指定注解的保留策略。有三种取值:RetentionPolicy.SOURCERetentionPolicy.CLASSRetentionPolicy.RUNTIME
      • RetentionPolicy.SOURCE表示注解只在源代码阶段保留,编译器在编译时会丢弃该注解,不会将其包含在字节码文件中。例如,一些用于代码检查的注解(如@Override在某些情况下)可以使用这种保留策略。
      • RetentionPolicy.CLASS表示注解在编译后的字节码文件中保留,但在运行时不能通过反射访问。这种策略用于一些在编译过程中有作用,但在运行时不需要的注解。
      • RetentionPolicy.RUNTIME表示注解在运行时仍然可以通过反射访问。这是最常用的策略之一,当需要在程序运行期间动态地获取和处理注解信息时,就需要使用这种保留策略,就像前面示例中的FragmentSetting注解,它可以在运行时获取路径和分组信息。
  3. 定义注解的成员变量(元素)
    • 注解可以包含成员变量,这些成员变量类似于接口中的方法定义。例如:
      public @interface MyAnnotation {
          String value() default "";
          int count() default 1;
      }
      
    • 这里定义了两个成员变量valuecount,它们都有默认值。在使用注解时,可以通过@MyAnnotation(value = "test", count = 3)这样的方式来指定成员变量的值,也可以省略成员变量的值,使用默认值,如@MyAnnotation(此时value""count1)。
    • 成员变量的类型可以是基本数据类型(byteshortintlongfloatdoublecharboolean)、String类型、Class类型、枚举类型以及以上类型的数组。例如:
      public @interface AnotherAnnotation {
          enum Color {RED, GREEN, BLUE}
          Color color() default Color.RED;
          Class<?> targetClass() default Object.class;
      }
      
    • 这个AnotherAnnotation注解包含了一个枚举类型的成员变量color和一个Class类型的成员变量targetClass,并分别指定了默认值。

http://www.kler.cn/a/383568.html

相关文章:

  • ubuntu 22.04 server python3 包 LTS
  • 批量将mysql的所有表都改成大写的存储过程
  • 如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
  • 微服务中常用分布式锁原理及执行流程
  • Ubuntu和Debian系列的Release默认shell解释器变更
  • 新160个crackme - 093-kesan
  • STM32学习笔记-外部中断和外部时钟
  • 前端学习笔记—Vue3特性
  • web安全测试渗透案例知识点总结(下)——小白入狱
  • Zookeeper分布式锁实现
  • 一个百度、必应搜索引擎图片获取下载的工具包
  • 音频模型介绍
  • 数据结构 ——— 向上调整建堆和向下调整建堆的区别
  • Linux-shell实例手册-磁盘
  • 在Ubuntu 上实现 JAR 包的自启动
  • 强化学习问题设计技巧
  • Spring-Day7
  • springboot020基于Java的免税商品优选购物商城设计与实现
  • 一七四、JavaScript里Object的常用方法及其示例
  • 揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁
  • 大模型低秩分解
  • Vue 2 + JavaScript + vuedraggable 集成案例
  • 【Effective C++】阅读笔记3
  • 深入了解逻辑回归:机器学习中的经典算法
  • 【css】overflow: hidden效果
  • 【设计模式】结构型模式(三):桥接模式、外观模式