自学内容网 自学内容网

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

举个例子

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,并分别指定了默认值。

原文地址:https://blog.csdn.net/weixin_35691921/article/details/141232949

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!