`
chenzehe
  • 浏览: 539623 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 注解 Anonotation

阅读更多

1、 什么是注解

Annotation表示一种注释的语法,在 Java 中最早提倡的是程序与配置相分离,而最新的理论是把所有配置直接写入到代码中,如果想完成这样的功能,则使用 Annotation

 

2、 系统内建的Annotation

 

2.1  @Override

重写父类的方法

 

2.2  @Deprecated

表示不建议使用的操作,如果使用该操作也不报错,只是在编辑器中出现横线警告信息,不建议使用。如Date 对像中的很多方法。

@ Deprecated

public   int  getDay ()   {

     return  normalize () .getDayOfWeek ()  - gcal.SUNDAY;

}

 

2.3   @SuppressWaring表示压制警告,如果出现警告信息,则可以压制不提示。 @SuppressWaring 的属性 String[] value() 为数组,说明可以同时压制多个警告。

@ Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE })

@ Retention ( RetentionPolicy.SOURCE )

public   @interface  SuppressWarnings  {

     String []  value () ;

}

 

3、自定义 Annotation

 

3.1 语法

public @interface 名称 {

}


3.2 定义 MyAnnotaion

package  com.chenzehe.annotation;

    public   @interface   MyAnnotation   {

}

如果要使用此Annotation, 则使用 @ 符访问,不在同一个包中需要导入。如下面 Info 类的使用:

package com.chenzehe.annotation;

@MyAnnotation

public class Info {

}


3.3 Annotation的属性定义

Annotation的属性定义以 () 结尾。

package  com.chenzehe.annotation;

public   @interface   MyAnnotation   {

     public  String key () ;

     public  String value () ;

}

上面Annotation 定义了两个变量 key value ,如果要使用此 Annotation ,则必须明确的给出其内容。如:

package  com.chenzehe.annotation;

@MyAnnotation ( key= "name" ,value= "chenzehe" )

public   class  Info  {

}

 

如果想给Annotation 的变量设置默认值,则使用 default 关键字完成,如:

package  com.chenzehe.annotation;

public   @interface   MyAnnotation   {

  public  String key ()   default   "name" ;

    public  String value ()   default   "chenzehe" ;

}

使用此Annotation 时,可以不用显示的设置变量值,而使用默认值。


3.4 Annotation中的属性值可以通过枚举限制

定义枚举类型Color:

package  com.chenzehe.annotation;

public   enum  Color  {

     RED , GLREN , BLUE ;

}

MyAnnotation 中定义一个 Color 类型的变量:

package  com.chenzehe.annotation;

public   @interface   MyAnnotation   {

     public  Color color ()   default  Color. RED ;

}

则使用MyAnnotation 中的 color 变量时,值只能取 Color 中定义的类型:

package  com.chenzehe.annotation;

@MyAnnotation ( color= "red" )

public   class  Info  {

}

上面给变量color 赋值出错,正确如下:

package  com.chenzehe.annotation;

@MyAnnotation ( color = Color. RED )

public   class  Info  {

}


3.5 Annotation中的属性为数组类型

如果Annotation 中的属性为数组类型,则使用的时候必须按照数组的方式操作。

package  com.chenzehe.annotation;

public   @interface   MyAnnotation   {

public  String []  urls () ;

}

使用:

package  com.chenzehe.annotation;

@MyAnnotation ( urls =  {   "www.baidu.com" "g.cn"   })

public   class  Info  {

}

4 注释类型 Retention 枚举 RetentionPolicy

@Documented

@Retention ( value = RUNTIME )

@Target ( value = ANNOTATION_TYPE )

public @interface  Retention

      指示注 类型的注释要保留多久 ,也就是作用范围。 如果注释类型声明中不存在 Retention  注释,则保留策略默认为  RetentionPolicy.CLASS 。只有元注释类型直接用于注释时, Target  元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。

枚举 RetentionPolicy 定义了三种 Annotation的范围:

CLASS   在编译之后的 class文件中作用

RUNTIME   在运行的时候起作用

SOURCE   只在源代码中起作用

系统内置的三个Annotation 的作用域分别为:

@ Override @Retention ( value = SOURCE ) 源码

@ Deprecated @Retention ( value = RUNTIME ) 运行时

@ SuppressWarnings @Retention ( value = SOURCE ) 源码

 

5、 反射与Annotation

一个Annotation 如果要想起作用,则肯定要依赖反射机制,通过反射可以取得一个方法上声明的  Annotation 全部内容。任何一下自定义的 Annotation 都是继承了 java.lang.annotation.Annotation 接口。

Field   Method   Constructor  的父类 AccessibleObject   定义了如下与Annotation 操作相关的方法:

取得全部Annotation  public  Annotation []   getAnnotations ()   

判断操作的是否是指定的Annotation public boolean  isAnnotationPresent ( Class <? extends  Annotation > annotationClass) 

例:下面Info 类中 toString() 方法使用的 Annotation ,在 Test 类中用反射访问这些 Annotation

package  com.chenzehe.annotation;

public   class  Info  {

     @Override

     @Deprecated

     @SuppressWarnings ( value =  "" )

     public  String  toString ()   {

         return   "Hello World!" ;

     }

}

 

package  com.chenzehe.annotation;

import  java.lang.annotation.Annotation;

import  java.lang.reflect.Method;

public   class  Test  {

     public   static   void  main ( String []  args )   throws  Exception  {

         Class<?> cls = Class. forName ( "com.chenzehe.annotation.Info" ) ;

         Method method = cls.getMethod ( "toString" ) ;

         Annotation []  annotations = method.getAnnotations () ;

         for   ( int   i  = 0;  i  < annotations. length i ++ )   {

             System. out .println ( annotations [ i ]) ;

         }

     }

}

输出:@java.lang.Deprecated() ,而 Info 类中使用的三个 Annotation 中,只有 Deprecated 的范围为 runtime ,说明只有范围在 runtime 的才能被找到。

 

MyAnnotation 类改成 runtime 范围,并在 Test 类中用反射取得他的属性:

package  com.chenzehe.annotation;

import  java.lang.annotation.Retention;

import  java.lang.annotation.RetentionPolicy;

@Retention ( value = RetentionPolicy. RUNTIME )

public   @interface   MyAnnotation   {

     public  String key ()   default   "name" ;

     public  String value () ;

}

Info中使用该 Annotation

package  com.chenzehe.annotation;

public   class  Info  {

     @Override

     @Deprecated

     @SuppressWarnings ( value =  "" )

     @MyAnnotation ( value= "chenzehe" )

     public   String   toString ()   {

         return   "Hello World!" ;

     }

}

Test类中使用反射取得其属性:

package  com.chenzehe.annotation;

import  java.lang.annotation.Annotation;

import  java.lang.reflect.Method;

public   class  Test  {

     public   static   void  main ( String []  args )   throws  Exception  {

         Class<?> cls = Class. forName ( "com.chenzehe.annotation.Info" ) ;

         Method method = cls.getMethod ( "toString" ) ;

         Annotation []  annotations = method.getAnnotations () ;

         for   ( int  i = 0; i < annotations. length ; i++ )   {

             if   ( method.isAnnotationPresent ( MyAnnotation . class ))   {

                 MyAnnotation  myAnnotation = method.getAnnotation ( MyAnnotation . class ) ;

                 String key = myAnnotation.key () ;

                 String value = myAnnotation.value () ;

                 System. out .println ( key +  ":"  + value ) ;

             }

         }

     }

}

 

6、 Target

java.lang.annotation 中已定义的注解类型 Target  ,用于指定所定义的注解使用的范围为方法、类、属性等。

默认情况下一个自定义的Annotation 可以在任意地方使用,如自定义的 MyAnnotation ,如果没有指定 Target ,则可以在任意地方使用:

package  com.chenzehe.annotation;

@MyAnnotation ()

public   class  Info  {

     @MyAnnotation ()

     private  String name ;

     @MyAnnotation ()

     public  String toString ()   {

         return   "Hello World!" ;

     }

}

Target 的定义中, value 的属性类型为   ElementType [] ,所指定的范围有以下八种:

1、 只能在Annotation 中出现: ANNOTATION_TYPE  

2、 只能在构造方法中出现: CONSTRUCTOR  

3、 在属性中出现: FIELD  

4、 只能在本地变量中出现: LOCAL_VARIABLE  

5、 在方法上出现: METHOD  

6、 在包声明中出现: PACKAGE  

7、 在参数声明中出现: PARAMETER  

8、 类、接口(包括注释类型)或枚举声明 中使用:   TYPE  

如以下自定义的MyAnnotation 只能在方法中使用:

package  com.chenzehe.annotation;

import  java.lang.annotation.ElementType;

import  java.lang.annotation.Retention;

import  java.lang.annotation.RetentionPolicy;

import  java.lang.annotation.Target;

@Retention ( value = RetentionPolicy. RUNTIME )

@Target ( value= ( ElementType. METHOD ))

public   @interface   MyAnnotation   {

    public  String key ()   default   "name" ;

    public  String value ()   default   "chenzehe" ;

}

Target中的属性 value 定义为数组类型,所以可以同时设置多个 ElementType ,如:

@Target ( value =  {  ElementType. METHOD , ElementType. FIELD   })

 

7、 Document注解

java.lang.annotation 中定义的注解类型 Documented  , 指示某一类型的注释将通过 javadoc  和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用  Documented  来注释的,则其注释将成为注释元素的公共  API  的一部分。 

如声明 MyAnnotation注解:

package  com.chenzehe.annotation;

import  java.lang.annotation.Documented;

import  java.lang.annotation.ElementType;

import  java.lang.annotation.Retention;

import  java.lang.annotation.RetentionPolicy;

import  java.lang.annotation.Target;

@Documented

@Retention ( value = RetentionPolicy. RUNTIME )

@Target ( value =  {  ElementType. METHOD , ElementType. FIELD   })

public   @interface   MyAnnotation   {

     public  String key ()   default   "name" ;

     public  String value ()   default   "chenzehe" ;

}

Info 类中使用:

package  com.chenzehe.annotation;

public   class  Info  {

     /**

     * 此方法是覆盖Object中的toString()方法

     */

     @ MyAnnotation ()

     public  String toString ()   {

         return   "Hello World!" ;

     }

}

可以通过eclipse export 导出 javadoc ,在其注释中能看到上面编写的注释

 

8、 Inherited

java.lang.annotation 中声明 Inherited  ,表示该annotation 是否被该子类断承下去,如果没有此注解,说明不能被断承。

如自定义的MyAnnotation ,加入 @Inherited ,说明此 Annotation 可以被子类断承:

package  com.chenzehe.annotation;

import  java.lang.annotation.Inherited;

import  java.lang.annotation.Retention;

import  java.lang.annotation.RetentionPolicy;

@Inherited

@Retention ( value = RetentionPolicy. RUNTIME )

public   @interface   MyAnnotation   {

    public  String key ()   default   "name" ;

     public  String value ()   default   "chenzehe" ;

}

Info类中使用该 Annotation

package  com.chenzehe.annotation;

@ MyAnnotation

public   class  Info  {

}

创建Info 类的子类 PersonInfo

package  com.chenzehe.annotation;

public   class  PersonInfo  extends  Info  {

}

使用反射取得PersonInfo 类的 annotation 信息:

package  com.chenzehe.annotation;

import  java.lang.annotation.Annotation;

public   class  Test  {

     public   static   void  main ( String []  args )   throws  Exception  {

         Class<?> cls = Class. forName ( "com.chenzehe.annotation.PersonInfo" ) ;

         Annotation []  annotations = cls.getAnnotations () ;

         for   ( int  i = 0; i < annotations. length ; i++ )   {

             System. out .println ( annotations [ i ]) ;

         }

     }

}

如果MyAnnotation 中加入 @Inherited ,则可以取到 MyAnnotaion信息,如果没有加则取不到。

 

分享到:
评论

相关推荐

    java注解代码java注解代码

    java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解代码java注解...

    java注解webservice学习第一篇

    Java注解是Java编程语言中的一个重要特性,它允许在代码中添加元数据,为编译器、解释器或任何其他工具提供额外的信息。在Java Web服务(WebService)开发中,注解的应用极大地简化了服务的创建和配置。本文将深入...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    java注解深入理解

    Java注解是Java编程语言中的一个重要特性,它提供了一种元数据的方式,允许程序员在代码中插入额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在现代Java开发中扮演了不可或缺的角色,尤其...

    java注解大全(非常全面)

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,允许程序员在代码中插入信息,这些信息可以被编译器或运行时环境用于处理代码。注解不仅简化了开发,还增强了代码的可读性和维护性。本资料...

    Eclipse Java注释模板.txt

    ### Eclipse Java注释模板知识点详解 #### 一、概述 在进行Java开发的过程中,良好的代码注释习惯不仅能帮助自己快速回顾代码逻辑,还能方便其他开发者理解代码意图,从而提高整个团队的工作效率。Eclipse作为一款...

    Java注解实现方式

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中嵌入元数据,这些元数据可以被编译器或运行时环境用来执行各种任务,例如代码分析、验证、生成代码、部署等。注解提供了更加灵活和可扩展的方式来处理...

    Eclipse Java 注释模板

    Eclipse作为一款强大的Java集成开发环境(IDE),提供了许多便捷的功能,其中之一就是“Eclipse Java 注释模板”。通过配置和使用这些模板,程序员可以快速地为代码添加注释,提高代码的可读性和维护性。下面我们将...

    java的注释规范(单行注释、多行注释、分块注释)

    java 注释规范详解 java 注释规范是 Java 开发过程中不可或缺的一部分,它的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。java 注释规范可以分为三种:单行注释...

    java注释模板

    eclipse中java类注释模板,有需要的朋友可以参考使用。

    Java 注解技术视频详解

    Java注解技术是Java平台中一个非常重要的特性,它为元数据提供了强大的支持,使得开发者能够在代码中嵌入额外的信息,这些信息可以被编译器、JVM或第三方工具读取和处理。在本视频教程中,我们将深入探讨Java注解的...

    Java注释规范

    Java 注释规范 Java 注释规范是为了让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。该规范定义了 Java 项目中注释的规范和要求,包括注释的类型、注释的内容、注释的位置...

    Java注释全解文档

    Java注释是编程过程中的重要组成部分,它们不仅有助于提高代码的可读性和可维护性,还能为其他开发者提供代码的功能解释和使用指南。本篇全解文档深入探讨了Java注释的各种类型及其在不同框架中的应用,如Hibernate...

    java 注解开发(包含详细注释,项目可以直接运行)

    Java注解是自JDK1.5版本引入的一种元数据机制,它允许程序员在源代码的各个层次(类、方法、变量等)嵌入信息,这些信息可以被编译器或者运行时系统用来进行各种处理。注解简化了配置文件的使用,提高了代码的可读性...

    Java的注释

    ### Java的注释 在Java开发中,良好的注释习惯对于提高代码的可读性和可维护性至关重要。本文将详细介绍几种常见的Java注释方式及其用途,并通过实例展示如何设置Eclipse IDE中的注释模板,帮助开发者更好地管理和...

    Java代码注释率检查器.rar

    Java代码注释是编程实践中非常重要的一个环节,它有助于提高代码的可读性和维护性。注释能够解释代码的功能、用途以及实现逻辑,使得其他开发者能更快地理解代码,尤其在团队协作中更是不可或缺。本资源"Java代码...

    Java 使用注解拼接SQL语句

    在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或运行时环境用来执行特定的任务。"Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得...

    入门级java 注解学习示例代码

    Java注解(Annotation)是Java语言的一个重要特性,它为元数据提供了强大的支持。元数据是一种描述数据的数据,它提供了一种安全的方式,使我们可以在不改变程序代码本身的情况下,向编译器或运行时环境提供额外的...

    java注解整理

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,让开发者能够向编译器或运行时环境传递额外的信息。这些信息可以用来验证代码、自动生成代码、配置框架或者在运行时进行一些处理。注解的使用...

Global site tag (gtag.js) - Google Analytics