首页 > 编程语言 >java注解详解以及如何获取注解的上的信息

java注解详解以及如何获取注解的上的信息

时间:2022-11-20 18:34:34浏览次数:36  
标签:java String value class 详解 注解 ElementType public

目录

一、Java自定义注解详解

1.定义注解:

注解的定义很像接口的定义。事实上与其他java接口一样,注解也会被编译成class文件。定义注解时需要一些元注解。

2.元注解介绍

@Target详细介绍

描述
ElementType.TYPE 接口、类、枚举、注解
ElementType.FIELD 字段、枚举的常量
ElementType.METHOD 方法
ElementType.PARAMETER 方法参数
ElementType.CONSTRUCTOR 构造函数
ElementType.LOCAL_VARIABLE 局部变量
ElementType.ANNOTATION_TYPE 注解
ElementType.PACKAGE

@Relation详细介绍

描述
RetentionPolicy.SOURCE 注解将被编译器丢弃,此处是源码阶段也就是javac编译时
RetentionPolicy.CLASS 注解在class中可用,但会被vm丢弃
RetentionPolicy.RUNTIME vm运行期间也会保留注解,可以使用反射机制读取注解的信息

@Documented介绍

将此注解包含在javadoc中

@Inherited介绍

允许子类继承父类中的注解,千万不要误解是注解的嵌套,是Class类继承的时候,是否拥有父类的注解

3.注解可用的类型

  • 所有基本类型(int、float、double,boolean)

  • String

  • Class

  • enum

  • Annotaion

  • 以上类型的数组

    注解可以嵌套注解

4.默认值限制

元素必须具有默认值,默认值不能是null

注解不支持继承,不像类一样可以通过extends继承

5.创建一个简单的自定义注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CustomAnnotation {
}

二、读取注解上的信息

通过反射机制去获取注解上的信息

  • 创建各种类型的注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnnotationForClass {
        String value();
    }
    
    @Target(ElementType.CONSTRUCTOR)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnnotationForConstructor {
        String value();
    }
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnnotationForField {
        String value();
    }
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnnotationForMethod {
        String value();
    }
    
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnnotationForParam {
        String value();
    }
    
    
  • 带有各种注解的测试类

    @AnnotationForClass(value = "AnnotationForClassValue")
    public class Test {
        @AnnotationForField(value = "AnnotationForFieldValue")
        private String name;
    
        @AnnotationForMethod(value = "AnnotationForMethodValue")
        public String getName() {
            return this.name;
        }
    
        public void setName(@AnnotationForParam(value = "AnnotationForParamValue") String name) {
            this.name = name;
        }
    
        @AnnotationForConstructor(value = "AnnotationForConstructorValue")
        public Test() {
        }
    }
    
  • 获取注解以及注解上的信息

    public class Main {
    
        // getDeclaredAnnotations 获取所有的注解
        // getDeclaredAnnotation 获取指定的注解
        public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException {
            Class<Test> testClazz = Test.class;
    
            // 获取(类、接口、枚举、注解)上注解的
            AnnotationForClass annotationForClass = testClazz.getDeclaredAnnotation(AnnotationForClass.class);
            System.out.println("类上的注解的值\t" + annotationForClass.value());
    
            // 获取类中构造器的注解
            Constructor<Test> constructor = testClazz.getConstructor();
            AnnotationForConstructor annotationForConstructor = constructor.getDeclaredAnnotation(AnnotationForConstructor.class);
            System.out.println("类中构造器的注解的值\t" + annotationForConstructor.value());
    
            // 获取类中字段的注解
            Field nameField = testClazz.getDeclaredField("name");
            AnnotationForField annotationForField = nameField.getDeclaredAnnotation(AnnotationForField.class);
            System.out.println("类中字段的注解的值\t" + annotationForField.value());
    
            // 获取类中方法的注解
            Method getNameMethod = testClazz.getDeclaredMethod("getName");
            AnnotationForMethod annotationForMethod = getNameMethod.getDeclaredAnnotation(AnnotationForMethod.class);
            System.out.println("类中方法的注解的值\t" + annotationForMethod.value());
    
            // 获取方法上参数的注解
            Method setNameMethod = testClazz.getDeclaredMethod("setName", String.class);
            AnnotationForParam annotationForParam = setNameMethod.getDeclaredAnnotation(AnnotationForParam.class);
            System.out.println("类中方法的参数的注解的值\t" + annotationForParam.value());
        }
    }
    
  • 运行结果

    类上的注解的值 AnnotationForClassValue
    类中构造器的注解的值 AnnotationForConstructorValue
    类中字段的注解的值 AnnotationForFieldValue
    类中方法的注解的值 AnnotationForMethodValue
    类中方法的参数的注解的值 AnnotationForParamValue

标签:java,String,value,class,详解,注解,ElementType,public
From: https://www.cnblogs.com/linmt/p/16909142.html

相关文章

  • 图文详解在VMware Workstation 16 PRO虚拟机上安装Ubuntu 22.04.5 linux系统
    一、下载Ubuntulinux系统镜像机构下载地址官网地址https://cn.ubuntu.com/download南京大学https://mirrors.nju.edu.cn/ubuntu-releases/20.04.5/山东......
  • Java中使用脚本引擎运行脚本语言
    在Java中运行脚本语言,例如JavaScript。步骤:1、创建脚本引擎管理器ScriptEngineManager2、从管理器中获取一个引擎ScriptEngine3、通过put(key,valu......
  • JAVA接口
    JDK1.8之前接口是接口,类是类。它们是同一层次的概念。接口中没有构造器。接口如何声明:interface在JDK1.8之前,接口中只有两部分内容,(1)常量:固定修饰符:publicstaticfina......
  • JavaWeb笔记
    1.JavaEE项目的三层架构web层                    com.atguigu.web/servlet/controllerservice层         ......
  • jenkins配置从节点后运行报错java.net.ConnectException: Connection timed out: conn
    修改jenkins配置中的ip系统管理-系统配置  修改ip与访问地址相同 ......
  • JAVA学习方法与知识点
       这个时代有很多的朋友都开始选择看看学习学习当下热门的编程语言比如现在的Java这类技术。俗话说的好啊天下熙熙皆为利来,天下攘攘皆为利往,目前大多都是为了高薪工......
  • javascript: 用图片加载演示promise的应用(chrome 107.0.5304.110)
    一,js代码:<html><head><metacharset="utf-8"/><title>测试</title></head><body><imgid="img"src=""/><script>//记录开始时间leta=newDate......
  • 图文详解在VMware Workstation 16 PRO虚拟机上安装Rocky 8.6 linux系统
    一、安装VMwareWorkstation虚拟机下载VMwareWorkstation16PRO虚拟机https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html,下载后安......
  • 小新学Java9
    一、Object类1.1Object类的toString方法toStringpublicStringtoString()返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字......
  • java注解
    @Override:复写、覆盖父类方法@Deprecated:方法已经过时了1、普通引入类与注解:1.1普通的引入类使用:2、注解分类2.1源码注解:只在源码中存在,编译成.class后就不存在了......