Java Annotation 注解

转载 2012年03月23日 15:06:23

Annotation(注解)是什么?

附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

1、Annotation的定义

首先看一下如何定义我们自己的注解,下面是SpringMvc中RequestParam注解的定义。
@Retention(RetentionPolicy.RUNTIME) // 注解的保留策略
@Target(ElementType.PARAMETER)  // 注解的作用目标
@Documented
public @interface RequestParam {  // 使用@interface定义注解
    String value() 
default "";  // 类似方法的属性
    
boolean required() default true;  // 使用default指定属性的默认值
    String defaultValue() 
default ValueConstants.DEFAULT_NONE;
}

使用方式如下:
void deleteUser(@RequestParam(value="id",required=false) Long id)  { }

2、元注解

元注解是指注解的注解。包括  @Retention @Target @Document @Inherited四种。

2.1、@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)   注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)      默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)   注解会在class字节码文件中存在,在运行时可以通过反射获取到

2.2、@Target:定义注解的作用目标

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

2.3、@Document:说明该注解将被包含在javadoc中

2.4、@Inherited:说明子类可以继承父类中的该注解

3、通过反射读取注解


package java.lang.reflect;
import java.lang.annotation.Annotation;

public interface AnnotatedElement {
    
/**判断该元素中某个注解类型是否存在*/
     
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);

   
/**获得该元素中某个注解类型的注解*/
    
<extends Annotation> T getAnnotation(Class<T> annotationClass);

    
/**获得该元素中所有可见的注解,包含继承得到的注解*/
    Annotation[] getAnnotations();

    
/**获得该元素自身什么的注解,不包含继承得到的注解*/
    Annotation[] getDeclaredAnnotations();
}

java.lang.Package
java.lang.Class
java.lang.reflect.Construtor
java.lang.reflect.Field
java.lang.reflect.Method
均实现了该接口,所以我们可以通过反射获取到 Class、Construtor、Field、Mehtod等,然后再通过上述接口方法,获得作用在这些元素上的注解。
下面是RequestParam注解的使用,为便于演示,略作修改,见org.springframework.web.bind.annotation.support.HandlerMethodInvoker源码

Method handlerMethod = *****;
Annotation[] paramAnns 
= handlerMethod.getParameterAnnotations();

String paramName 
= null;
boolean required = false;
String defaultValue 
= null;

for (Annotation paramAnn : paramAnns) {
    
if (RequestParam.class.isInstance(paramAnn)) {
        RequestParam requestParam 
= (RequestParam) paramAnn;
        paramName 
= requestParam.value();
        required 
= requestParam.required();
        defaultValue 
= parseDefaultValueAttribute(requestParam.defaultValue());
        annotationsFound
++;
    }
       
// *******其他处理*******************             
}


4、常见注解的说明及使用

@Override :@Target(ElementType.METHOD)   @Retention(RetentionPolicy.SOURCE)  说明方法是对父类方法的覆盖,用于编译器编译时进行检查
@Deprecated: @Documented  @Retention(RetentionPolicy.RUNTIME)   用于建议不要使用某元素
@SuppressWarnings:@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE)  
    说明对被批注的代码元 素内部的某些警告保持静默

Java Annotation注解继承方式说明

有关Annotation的继承说明: 1、JDK文档中的说明是:只有在类上应用的Annotation才能被继承,而实际应用时的结果是:除了类上应用的Annotation能被继承外,没有被重写的方法的...
  • zxmsdyz
  • zxmsdyz
  • 2015年03月22日 22:32
  • 2127

Java Annotation详解+自定义java注解(一)

java annotation的详解,元注解的详解 注解的注解: 我们可以通过元注解来实现一个自定义的HelloWorld注解...
  • emilyRR
  • emilyRR
  • 2015年08月07日 21:52
  • 1401

Java Annotation及注解原理简析

参考资料:http://www.trinea.cn/android/java-annotation-android-open-source-analysis/                     ...
  • u012227846
  • u012227846
  • 2015年01月15日 10:41
  • 3880

深入理解Java:注解(Annotation)自定义注解入门

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处...
  • changsimeng
  • changsimeng
  • 2017年03月22日 10:35
  • 719

简单自定义Annotation和利用反射获取注解中的值

用一个简单例子 自定义注解: import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;...
  • zxdfc
  • zxdfc
  • 2015年10月20日 00:33
  • 2949

spring中自定义注解(annotation)与AOP中获取注解

spring中自定义注解(annotation)与AOP中获取注解 标签: annotation aop sprin 2015-04-15 16:51 25410人阅读 评论(1) 举...
  • gaoqiao1988
  • gaoqiao1988
  • 2016年12月12日 17:06
  • 2773

深入理解Java:自定义注解入门(Annotation)

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:...
  • zhuyuehui99
  • zhuyuehui99
  • 2017年02月25日 10:19
  • 524

java动态代理对象实现日志的拦截(annotation自定义注解方式)

java动态代理对象,实现日志的输出,另外自定义annotation,实现注解类动态对象日志的拦截。...
  • kevon_sun
  • kevon_sun
  • 2016年04月02日 22:50
  • 2663

Java中实现自定义的注解处理器(Annotation Processor)

在之前的《简单实现ButterKnife的注解功能》中,使用了运行时的注解实现了通过编写注解绑定View与xml。由于运行时注解需要在Activity初始化中进行绑定操作,调用了大量反射相关代码,在界...
  • ucxiii
  • ucxiii
  • 2016年07月25日 19:42
  • 7202

详解JDK 5 Annotation 注解之@Target的用法介绍

前言 目前,越来越多的架构设计在使用注解,例如spring3.0、struts2等框架。让我们先来看看注解的定义。如下是一段使用了JDK 5 Annotation @Target的代码: ...
  • snakeMoving
  • snakeMoving
  • 2017年07月04日 23:44
  • 453
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Annotation 注解
举报原因:
原因补充:

(最多只允许输入30个字)