java-注解

注解的概念

注解(Annotation)是Java提供的设置程序中元素的关联信息和元数据(MetaData)的方法,它是一个接口,程序可以通过反射获取指定程序中元素的注解对象,然后通过该注解对象获取注解中的元数据信息

注解(Annotation)是 Java 5 引入的一种特殊语法,它允许我们在代码中添加元数据(Metadata),即注释信息,来描述类、方法、字段等程序成员的特性和功能。注解可以帮助程序员更好地理解和维护代码,并且提供了一种通用的机制来实现某些功能,如生成文档、配置文件、单元测试等。

注解本身没有实际的业务逻辑,只是起到了标记的作用,告诉编译器或运行时环境要执行相应的操作。注解以 “@” 符号开头,放置于类、方法、变量等声明前面。

元注解

元注解(Meta-Annotation)是一种用于标记其他注解的注解。Java 中提供了几种元注解,用于指定注解的行为和作用域。

Java 提供的元注解包括:

  1. @Target:用于指定注解可以应用的目标(比如类、方法、字段、参数等)。
    • @Target 常用的取值包括:
      • ElementType.TYPE:用于类、接口、枚举等类型的声明。
      • ElementType.FIELD:用于字段声明,包括枚举常量。
      • ElementType.METHOD:用于方法声明。
      • ElementType.PARAMETER:用于方法参数声明。
      • ElementType.CONSTRUCTOR:用于构造函数声明。
      • ElementType.LOCAL_VARIABLE:用于局部变量声明。
      • ElementType.ANNOTATION_TYPE:用于注解类型声明。
      • ElementType.PACKAGE:用于包声明。
  2. @Retention:用于指定注解的生命周期(比如在源码中保留、编译时保留、运行时保留等)。
    • RetentionPolicy.SOURCE:表示注解只保留在源代码中,编译后不会包含在字节码中,因此不会对运行产生任何影响。
    • RetentionPolicy.CLASS:表示注解保留在字节码中,在程序编译时加载到 JVM 中,但是在运行时不可见。
    • RetentionPolicy.RUNTIME:表示注解保留在类文件中并在运行时可见,因此可以通过反射机制读取注解信息。
  3. @Inherited:用于指定注解是否可以被子类继承。(常用为true)
    • @Inherited 元注解只有一个取值,即布尔类型的 value,默认值为 true。如果将 value 设置为 false,则该注解将不会被继承。
    • 需要注意的是,@Inherited(false) 注解仅对直接继承的子类起作用,对于间接继承的子类无效。也就是说,如果一个类中定义了一个注解 MyAnnotation 并标记了 @Inherited(false),那么该注解将不会被其直接继承的子类所继承,但是如果该直接继承的子类再定义一个间接继承的子类,则该注解会被间接继承的子类所继承。
  4. @Documented:用于指定注解是否需要生成文档。

示例代码

 	@Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface NeedCheckPermission {
        String value() default "";
    }

    // 定义一个测试类,在方法上添加 "NeedCheckPermission" 注解
    public static class TestClass {
        @NeedCheckPermission("admin")
        public void testMethod() {
            System.out.println("This is a test method.");
        }
    }

    // 在主函数中使用反射来获取注解信息
    public static void main(String[] args) throws Exception {
        TestClass test = new TestClass();
        Method method = test.getClass().getMethod("testMethod");

        // 判断方法是否有 "NeedCheckPermission" 注解,并输出注解信息
        if (method.isAnnotationPresent(NeedCheckPermission.class)) {
            NeedCheckPermission annotation = method.getAnnotation(NeedCheckPermission.class);
            System.out.println("该方法需要进行权限检查,权限值为:" + annotation.value());
        } else {
            System.out.println("该方法不需要进行权限检查。");
        }
    }

你可能感兴趣的:(java,java,开发语言)