使用自定义注解标注当前类
- 举个例子
- 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类,包含path和group属性。BaseFragment抽象类在构造函数中通过反射获取FragmentSetting注解的值,并提供getPath和getGroup方法来获取这些值。HomeFragment和SettingsFragment是具体的Fragment类,使用FragmentSetting注解标注,它们继承自BaseFragment,可以直接使用getPath和getGroup方法。- 在
main方法中创建了HomeFragment和SettingsFragment的实例,并输出它们的path和group信息。
自定义注解是如何定义的
- 定义语法基础
- 在Java中,自定义注解是通过
@interface关键字来定义的。例如,public @interface MyAnnotation就定义了一个名为MyAnnotation的注解。 - 注解本质上是一种特殊的接口,它的成员变量(也称为元素)默认是
public、static和final的。
- 在Java中,自定义注解是通过
- 元注解的使用
- @Target:
- 这个元注解用于指定自定义注解可以应用的目标元素类型。例如
@Target(ElementType.TYPE)表示该注解可以用于类、接口、枚举等类型定义上;@Target(ElementType.METHOD)表示注解可以用于方法上;@Target(ElementType.FIELD)表示可用于成员变量(字段)上。它的参数是ElementType枚举类型的值,这个枚举包含了多种元素类型,如TYPE、METHOD、FIELD、PARAMETER(方法参数)、CONSTRUCTOR(构造方法)等。
- @Retention:
- 用于指定注解的保留策略。有三种取值:
RetentionPolicy.SOURCE、RetentionPolicy.CLASS和RetentionPolicy.RUNTIME。 RetentionPolicy.SOURCE表示注解只在源代码阶段保留,编译器在编译时会丢弃该注解,不会将其包含在字节码文件中。例如,一些用于代码检查的注解(如@Override在某些情况下)可以使用这种保留策略。RetentionPolicy.CLASS表示注解在编译后的字节码文件中保留,但在运行时不能通过反射访问。这种策略用于一些在编译过程中有作用,但在运行时不需要的注解。RetentionPolicy.RUNTIME表示注解在运行时仍然可以通过反射访问。这是最常用的策略之一,当需要在程序运行期间动态地获取和处理注解信息时,就需要使用这种保留策略,就像前面示例中的FragmentSetting注解,它可以在运行时获取路径和分组信息。
- 用于指定注解的保留策略。有三种取值:
- @Target:
- 定义注解的成员变量(元素)
- 注解可以包含成员变量,这些成员变量类似于接口中的方法定义。例如:
public @interface MyAnnotation {String value() default "";int count() default 1; } - 这里定义了两个成员变量
value和count,它们都有默认值。在使用注解时,可以通过@MyAnnotation(value = "test", count = 3)这样的方式来指定成员变量的值,也可以省略成员变量的值,使用默认值,如@MyAnnotation(此时value为"",count为1)。 - 成员变量的类型可以是基本数据类型(
byte、short、int、long、float、double、char、boolean)、String类型、Class类型、枚举类型以及以上类型的数组。例如:public @interface AnotherAnnotation {enum Color {RED, GREEN, BLUE}Color color() default Color.RED;Class<?> targetClass() default Object.class; } - 这个
AnotherAnnotation注解包含了一个枚举类型的成员变量color和一个Class类型的成员变量targetClass,并分别指定了默认值。
- 注解可以包含成员变量,这些成员变量类似于接口中的方法定义。例如:
