• Java Annotation概述


    @(Java)[Annotation|Java]

    Java Annotation概述

    用途

    • 编译器的相关信息,如用于检测错误和一些警告
    • 编译时和部署时的处理,如一些软件用于自动生成代码之类的
    • 运行时处理

    自定义注解

    和接口的定义类似,只是用@interface来标识,注解中包含的属性可以具有默认值,如下:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface ActivityMetadata {
    	String activityName() default "活动";
    }
    

    预定义注解

    用于Java语言中的注解

    • @Deprecated:用于表示一些类,方法或者属性不再使用
    • @Override:用于指示编译器,表示元素覆盖了定义在父类的元素
    • @SuppressWarnings:用于指示编译器不再产生警告
    • @SafeVarargs:用于方法或者构造器,表示没有对其参数有不安全的操作,编译器不再产生未检查警告
    • @FunctionalInterface:Java 8中引入,定义类型为函数接口

    用于其它注解的注解(元注解)

    @Retention

    表示注解如何存储,也可以视作注解的生命周期

    说明
    RetentionPolicy.SOURCE 仅仅保留在源代码中,编译器忽略该注解
    RetentionPolicy.CLASS 可以用在在编译器在编译期间,但是JVM忽略该注解
    RetentionPolicy.RUNTIME 保留到JVM中,可以在运行期中使用

    :大部分框架自定义的注解一般用于RUNTIME,在运行期应用。

    @Documented

    表示在使用javadoc生成文档的时候,也需要将该注解包含进去

    @Target

    用于限制其它注解所能使用的范围

    范围
    ElementType.ANNOTATION_TYPE 注解
    ElementType.CONSTRUCTOR 构造器
    ElementType.FIELD 属性
    ElementType.LOCAL_VARIABLE 局部变量
    ElementType.METHOD 方法
    ElementType.PACKAGE 包定义
    ElementType.PARAMETER 方法参数
    ElementType.TYPE 任意类型

    @Inherited

    表示注解可以被继承,默认不继承

    @Repeatable

    Java 8 中引入,指示注解可以被重复应用于同一个元素

    示例:

    功能说明:定义一个注解,该注解用于反应属性的中文说明,程序使用反射从中解析出该类的属性以及对应的中文说明。

    Activity.java

    public class Activity {
    
    	@ActivityMeta(description="活动名称")
    	private String activityName;
    
    	@ActivityMeta(description="活动类型")
    	private String activityType;
    
    	public String getActivityName() {
    		return activityName;
    	}
    
    	public void setActivityName(String activityName) {
    		this.activityName = activityName;
    	}
    
    	public String getActivityType() {
    		return activityType;
    	}
    
    	public void setActivityType(String activityType) {
    		this.activityType = activityType;
    	}
    }
    

    ActivityMeta.java

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface ActivityMeta {
    	public String description();
    }
    

    Demo

    public class AnnotationDemo {
    
    	private static final Logger logger = LoggerFactory
    			.getLogger(AnnotationDemo.class);
    
    	@Test
    	public void demo() {
    
    		for (Field field : Activity.class.getDeclaredFields()) {
    			ActivityMeta activityMeta = field.getAnnotation(ActivityMeta.class);
    			logger.debug(field.getName()+":" + activityMeta.description());
    		}
    	}
    }
    

    输出:

    2016-07-16 12:12:41 [DEBUG]-[Thread: main]-[com.jabnih.analysis.annotation.AnnotationDemo.demo()]: 
    activityName:活动名称
    
    2016-07-16 12:12:41 [DEBUG]-[Thread: main]-[com.jabnih.analysis.annotation.AnnotationDemo.demo()]: 
    activityType:活动类型
    

    参考:

    官方Tutorial:
    https://docs.oracle.com/javase/tutorial/java/annotations/index.html

  • 相关阅读:
    Core Animation笔记(变换)
    Core Animation笔记(- Layer 基本属性)
    使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。
    MAC中使用APICloud同步代码错误解决办法
    【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载
    【深入理解Java虚拟机 】类的加载器
    【深入理解Java虚拟机】类的初始化过程
    Netty中ByteBuf的引用计数线程安全的实现原理
    Java使用PipedStream管道流通信
    Java中的守护线程
  • 原文地址:https://www.cnblogs.com/jabnih/p/5675980.html
Copyright © 2020-2023  润新知