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

(一)Java1.8核心包rt.jar——java.lang.annotation

1、Annotation

public interface Annotation {
   
    boolean equals(Object obj);

    int hashCode();

    String toString();
    
    Class<? extends Annotation> annotationType();
}
注解(Annotation),也叫元数据。JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
注解可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
注解是以‘@注解名’在代码中存在的,可以通过反射机制编程实现对这些元数据的访问。
注解可以在编译时选择是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

2、ElementType

public enum ElementType {
    /** 类、接口(包括注解类型)、或枚举声明。@MyAnnotation public class MyClass {} */
    TYPE,

    /** 字段声明(包括枚举常量)。@MyAnnotation private int myField  */
    FIELD,

    /** 方法声明。@MyAnnotation public void myMethod() {} */
    METHOD,

    /** 形式参数声明。public void myMethod(@MyAnnotation String param) {} */
    PARAMETER,

    /** 构造器声明。@MyAnnotation public MyClass(int value) {} */
    CONSTRUCTOR,

   /** 
    * 局部变量声明(但注意,Java 注解在 Java 8 之前不能用于局部变量)。
    * 
    * void myMethod() { @MyAnnotation int localVar; }
    */
    
    LOCAL_VARIABLE,

    /**
     * 注解类型声明。
     *
     *  @MyAnnotation public @interface MyOtherAnnotation {}
     */
    ANNOTATION_TYPE,

    /**
     * 包声明。从 Java 9 开始,注解可以应用于包声明
     *
     *  @MyAnnotation package com.example;
     */
    PACKAGE,

    /**
     * 类型参数声明(Java 8 引入)。
     *
     * public class MyClass<@MyAnnotation T> {}
     */
    TYPE_PARAMETER,

    /**
     * 类型的使用(Java 8 引入)。这允许注解应用于任何类型的使用,如泛型、强制类型转换等。
     *
     * public void myMethod(List<@MyAnnotation String> list) {}
     */
    TYPE_USE
}

3、RetentionPolicy

public enum RetentionPolicy {
    /**
     * 标记的注解仅在源代码级别保留,编译器会忽略它。
     */
    SOURCE,

    /**
     * 标记的注解在编译时由编译器保留,但被Java虚拟机(JVM)忽略。
     */
    CLASS,

    /**
     * 标记的注解由JVM保留,因此它可供运行时环境使用。
     */
    RUNTIME
}

4、示例

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestMethod{
    public String name() default "name";
    public boolean defaultValue() default false;
}
public class ReadAnnotationInfoTest {
    public static void main(String[] args) throws Exception {
        // 得到目标的类对象
        Class c = Class.forName("com.xxx.xxx.AnnotationTest");
        // 获取该类所有声明的方法
        Method[] methods = c.getDeclaredMethods();
        // 声明注解集合
        Annotation[] annotations;
        // 遍历所有的方法得到各方法上面的注解信息
        for (Method method : methods) {
            // 获取每个方法上面所声明的所有注解信息
            annotations = method.getDeclaredAnnotations();
            // 再遍历所有的注解,打印其基本信息
            System.out.println(method.getName());
            for (Annotation an : annotations) {
                System.out.println("方法名为:" + method.getName() + "其上面的注解为:" + an.annotationType().getSimpleName());
                Method[] meths = an.annotationType().getDeclaredMethods();
                // 遍历每个注解的所有变量
                for (Method meth : meths) {
                    System.out.println("注解的变量名为:" + meth.getName());
                }
            }
        }
    }
}

http://www.kler.cn/news/355924.html

相关文章:

  • Web APIs - 第2天笔记(黑马笔记)
  • MySQL的事务处理Savepoint,commit
  • 管家婆工贸ERP BB081.订单收付款功能
  • 【Vue】--项目文件结构
  • 线性可分支持向量机的原理推导 转为拉格朗日函数式 公式解析
  • 以太坊的未来面临挑战:Covalent Network(CXT)的 EWM 轻客户端提供解决方案
  • 大规模多传感器滑坡检测数据集,利用landsat,哨兵2,planet,无人机图像等多种传感器采集数据共2w余副图像,mask准确标注滑坡位置
  • C# -- Abstract、Virtual、interface
  • c++ 使用 Jarvis 算法或包装的凸包(Convex Hull using Jarvis’ Algorithm or Wrapping)
  • 问:JVM中的垃圾器,有哪些?
  • 嵌入式入门学习——7Protues导入Arduino IDE生成的固件和Arduino使用库文件开发
  • 大数据-177 Elasticsearch Query DSL - 聚合分析 指标聚合 桶聚合
  • 华为杯”第十三届中国研究生数学建模竞赛-E题:基于多目标规划和智能优化算法的粮食最低收购价政策研究(中)
  • 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键
  • 16.数组、指针、结构体与函数
  • 【github】git基础用法 git flow工作模式 常用命令
  • 解决React中的Hooks闭包陷阱
  • Linux历史
  • 基于SSM公廉租房维保系统的设计
  • 【vue】指令补充+样式绑定+计算属性+侦听器