栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Reflect - 注解的概念

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Reflect - 注解的概念

文章目录
    • 1. 元注解@Retention
    • 2. 元注解@Target
    • 3. 自定义注解

1. 元注解@Retention

@Retention只能用于修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的value成员变量,所以使用@Retention时必须为该value成员变量指定值。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    
    RetentionPolicy value();
}

value成员变量的值只能是如下3个。

  • RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM不再保留Annotation。这是默认值。
  • RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中。当运行Java程序时,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息。
  • RetentionPolicy.SOURCE:Annotation只保留在源代码中,编译器直接丢弃这种Annotation。

如果需要通过反射获取注释信息,就需要使用value属性值为RUNTIME的@Retention。使用@Retention元数据Annotation可采用如下代码为value指定值。

@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyParameter {
    
}
2. 元注解@Target

@Target也只能修饰一个Annotation定义,它用于指定被修饰的Annotation能用于修饰哪些程序单元。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    
    ElementType[] value();
}

@Target元Annotation也包含一个名为value的成员变量,该成员变量的值只能是如下几个:

  • ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation。
  • ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器。
  • ElementType.FIELD:指定该策略的Annotation只能修饰成员变量。
  • ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量。
  • ElementType.METHOD:指定该策略的Annotation只能修饰方法定义。
  • ElementType.PACKAGE:指定该策略的Annotation只能修饰包定义。
  • ElementType.PARAMETER:指定该策略的Annotation可以修饰参数。
  • ElementType.TYPE:指定该策略的Annotation可以修饰类、接口(包括注释类型)或枚举定义。
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD,ElementType.TYPE})
public @interface MyParameter {

}
3. 自定义注解
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD,ElementType.TYPE})
public @interface MyParameter {
    
    public int id();
    
    public String description() default "描述";
    
}

id和description类似于方法的定义,description有一个默认值,如果在使用注解时米哟给出description的值,则注解的处理器会使用次元素的默认值。

public class Main {
    
    @MyAnnotation(id=1,description = "haha")
    public void show1(){
        System.out.println("haha");
    }

    @MyAnnotation(id=1)
    public void show2(){
        System.out.println("haha");
    }
}

注解的元素在使用时,是名-值的方式。元素要么有默认值,要么在使用时提供元素的默认值,且默认值不能为null。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845695.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号