`
yangzb
  • 浏览: 3503269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

什么是Annotation?

    博客分类:
  • Java
阅读更多

在创建EJB组件时,必需提供一些定义,使得EJB组件使用一些服务例如:安全服务,持久化服务,事务服务。EJB容器可以提供这些服务,这样 EJB只要实现业务逻辑就可以了。但是说到底EJB容器使用EJB组件的元数据来提供这些服务,在以前EJB的元数据是以XML配置文件形式出现的,这些 配置文件与EJB源文件是分开的。
EJB的部署人员无法了解EJB本身的信息,如果EJB组件的创建者用注释(Annotation)的方法 将这些配置服务的信息和代码放在一起,这样EJB的部署者就可以了解EJB的信息,EJB的home接口可以使用Annotation自动生成,当然到目 前为止更好的是在简单的Java Object上使用Annotations。

一 什么是Annotation

在已经发布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数 据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。

二 定义一个简单的Annotation并使用它

1.定义Annotation

定义一个Annotation是什么简单的,它采取的是类似于Interface的定义方式: “@+annotation类型名称+(..逗号分割的name-value对...)”

 

代码
 
  1. //Example 1   
  2.   
  3. package  sz.starbex.bill.annotation;   
  4.   
  5. import  java.lang.annotation.Retention;   
  6.   
  7. import  java.lang.annotation.RetentionPolicy;   
  8.   
  9. import  java.lang.annotation.Target;   
  10.   
  11. import  java.lang.annotation.ElementType;   
  12.   
  13. @Retention (RetentionPolicy.RUNTIME)   
  14.   
  15. @Target (ElementType.METHOD)   
  16.   
  17. public   @interface  SimpleAnnotation {   
  18.   
  19. String value();   
  20.   
  21. }  

<script type="text/javascript">render_code();</script>

 

@Retention这个meta-annotation表示我们创建的SimpleAnnotation这个Annotation将会存储在Class文件中,并在java

VM运行时加载它。@Target这个meta-annotation表示我们创建的SimplwAnnotation将会为描述方法,而 @interface SimpleAnnotation是我们自定义的Annotation,它有一个成员叫value,返回值是String。

2.使用Annotation

 

代码
 
  1. //Example 2   
  2.   
  3. package  sz.starbex.bill.annotation;   
  4.   
  5. import  sz.starbex.bill.annotation.SimpleAnnotation;   
  6.   
  7. public   class  UsingSimpleAnnotation {   
  8.   
  9. @SimpleAnnotation (value= "Pass:This method will Pass" ) //注意name=value的用法   
  10.   
  11. public   void  pass(){   
  12.   
  13. if ( 10 > 5 ) System.out.println( "测试通过" );   
  14.   
  15. }   
  16.   
  17. @SimpleAnnotation ( "Fail:This method will Fail" ) //注意name=value的用法   
  18.   
  19. public   void  fail(){   
  20.   
  21. if ( 10 < 5 ) System.out.println( "测试失败" );   
  22.   
  23. }   
  24.   
  25. }  

<script type="text/javascript">render_code();</script>

 

一个Annotation用于程序元素(在本例中是method),在method方法之前用(@Annotation名称 (name=value,name=value.....)。在本例中是@SimpleAnnotation(value="Pass:This method will Pass")。每个annotation具有一个名字和成员个数>=0,当只有一个单一的成员时,这个成员就是value。我们也可以这样写 @SimpleAnnotation("Fail:This method will Fail")。至此@SimpleAnnotation将Pass和Fail联系起来了。

3.在运行时访问Annotation

一旦Annotation与程序元素联系起来,我们可以通过反射访问它们并可以取得它们的值。我们使用一个新的 interface:java.lang.reflect.AnnotatedElement。 java.lang.reflect.AnnotatedElement接口中的方法有:

a. boolean isAnnotationPresent(Class annotationType)

如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
b. T getAnnotation(Class annotationType)

如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
c. Annotation[] getAnnotations()

返回此元素上存在的所有注释。
d. Annotation[] getDeclaredAnnotations()

返回直接存在于此元素上的所有注释。
你要注意 isAnnotationPresent和getAnnotation方法,它们使用了Generics,请参考我的Java 范型的Blog。

下面我们列出一些实现了AnnotatedElement 接口的类

1. java.lang.reflect.AccessibleObject

2. java.lang.Class

3. java.lang.reflect.Constructor

4. java.lang.reflect.Field

5. java.lang.reflect.Method

6. java.lang.Package

下面的Example程序说明了如何在运行环境访问Annotation

 

代码
 
  1. package  sz.starbex.bill.annotation;   
  2.   
  3. import  sz.starbex.bill.annotation.SimpleAnnotation;   
  4.   
  5. import  java.lang.reflect.Method;   
  6.   
  7. public   class  SimpleAccessAnnotation {   
  8.   
  9. static   void  accessAnnotationTest(Class usingAnnnotationClass){   
  10.   
  11. try  {   
  12.   
  13. //Object usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance();   
  14.   
  15. Method [] methods=usingAnnnotationClass.getDeclaredMethods(); //取得对方法   
  16.   
  17. for (Method method:methods){   
  18.   
  19. System.out.println(method.getName());   
  20.   
  21. SimpleAnnotation    
  22.   
  23. simpleAnnotation=method.getAnnotation(SimpleAnnotation. class ); //得到方法的Annotation   
  24.   
  25. if (simpleAnnotation!= null ){   
  26.   
  27. System.out.print(simpleAnnotation.value()+ "==" );   
  28.   
  29. String result=invoke(method,usingAnnnotationClass);   
  30.   
  31. System.out.println(result);   
  32.   
  33. }   
  34.   
  35. }   
  36.   
  37. catch  (Exception e) {   
  38.   
  39. // TODO Auto-generated catch block   
  40.   
  41. e.printStackTrace();   
  42.   
  43. }   
  44.   
  45. }   
  46.   
  47. static  String invoke(Method m, Object o) {   
  48.   
  49. String result =  "passed" ;   
  50.   
  51. try  {   
  52.   
  53. m.invoke(m, new  Object[]{});   
  54.   
  55. catch  (Exception e) {   
  56.   
  57. // TODO Auto-generated catch block   
  58.   
  59. result =  "failed" ;   
  60.   
  61. }   
  62.   
  63. return  result;   
  64.   
  65. }   
  66.   
  67. /**  
  68.  
  69. * @param args  
  70.  
  71. */   
  72.   
  73. public   static   void  main(String[] args) {   
  74.   
  75. // TODO Auto-generated method stub   
  76.   
  77. accessAnnotationTest(UsingSimpleAnnotation. class );   
  78.   
  79. }   
  80.   
  81. }  

<script type="text/javascript">render_code();</script>

 

Java 中的Annotation的定义

Java中的Annotation

Java定义了几个标准的meta-annotation,在新Package中java.lang.annotation 中包含了以下meta-annotation:

meta-annotation 说明

@Target

1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。

meta-annotation 说明
@Target 1. annotation的target是一个被标注的程序元素。target说明了annotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。

2. ElementType的定义

TYPE// Class, interface, or enum (but not annotation)
FIELD// Field (including enumerated values)

METHOD// Method (does not include constructors)

PARAMETER// Method parameter

CONSTRUCTOR// Constructor

LOCAL_VARIABLE// Local variable or catch clause

ANNOTATION_TYPE// Annotation Types (meta-annotations)

PACKAGE// Java package

@Retention

1. SOURCE//按照规定使用注释,但是并不将它保留到编译后的类文件中

2. CLASS//将注释保留在编译后的类文件中,但是在运行时忽略它

3. RUNTIME//将注释保留在编译后的类文件中,并在第一次加载类时读取它

@Documented Documented 表示注释应该出现在类的 Javadoc 中

@Inherited 一个Annotation将被继承

三个标准的Annotation 在java.lang包中:

@Deprecated 对不再使用的方法进行注释
@Override 指明注释的方法覆盖超类的方法
@SuppressWarnings 阻止编译器的警告,例:当类型不安全时

下例来说明这三个标准的Annotation:

 

代码
 
  1. package  sz.starbex.bill.annotation;   
  2.   
  3. import  java.util.ArrayList;   
  4.   
  5. import  java.util.List;   
  6.   
  7. public   class  SimpleOverrideAnnotation {   
  8.   
  9. public   static   void  main(String[] args) {   
  10.   
  11. SimpleOverrideAnnotation test =  new  SimpleOverrideAnnotation();   
  12.   
  13. System.out.println(test.toString());   
  14.   
  15. }   
  16.   
  17. @Override   
  18.   
  19. public  String toString() {   
  20.   
  21. return   "自己的类自己输出" ;   
  22.   
  23. }   
  24.   
  25. @Deprecated   
  26.   
  27. public   void  doSomething() {   
  28.   
  29. System.out.println( "方法已过时"  );   
  30.   
  31. }   
  32.   
  33. @SuppressWarnings (value={ "unchecked" })   
  34.   
  35. public   void  testSuppressWarnings(){   
  36.   
  37. List testList= new  ArrayList();   
  38.   
  39. testList.add( "KKKK" ); //没有使用范型,类型不安全   
  40.   
  41. }   
  42.   
  43. }  

<script type="text/javascript">render_code();</script>

 

二、Annotation使用实例

一个组合的Annotation,注释类的

a. 商标Annotation

 

代码
 
  1. package  sz.starbex.bill.annotation;   
  2.   
  3. public   @interface  Trademark {   
  4.   
  5. String name();   
  6.   
  7. String owner();   
  8.   
  9. }   

<script type="text/javascript">render_code();</script>

 

b.License的annotation

 

代码
 
  1. package  sz.starbex.bill.annotation;   
  2.   
  3. import  java.lang.annotation.*;   
  4.   
  5. @Retention (RetentionPolicy.RUNTIME)   
  6.   
  7. @Target ({ElementType.TYPE, ElementType.PACKAGE})   
  8.   
  9. public   @interface  License {   
  10.   
  11. String name();   
  12.   
  13. String notice();   
  14.   
  15. boolean  redistributable();   
  16.   
  17. Trademark[] trademarks();   
  18.   
  19. }   

<script type="text/javascript">render_code();</script>

 

c.测试类

 

代码
 
  1. package  sz.starbex.bill.annotation;   
  2.   
  3. @License (name= "Bill" ,   
  4.   
  5. notice= "许可证" ,   
  6.   
  7. redistributable= true ,   
  8.   
  9. trademarks={ @Trademark (name= "Mercedes" ,owner= "Swedish" ),   
  10.   
  11. @Trademark (name= "Daewoo" ,owner= "Korean" )   
  12.   
  13. }    
  14.   
  15. )   
  16.   
  17. public   class  TestLicenseAnnotation {   
  18.   
  19. public   static   void  main(String[] args) {   
  20.   
  21. TestLicenseAnnotation test= new  TestLicenseAnnotation();   
  22.   
  23. License license=test.getClass().getAnnotation(License. class );   
  24.   
  25. System.out.println( "License发放人:" +license.name());   
  26.   
  27. System.out.println( "License注意事项:" +license.notice());   
  28.   
  29. System.out.println( "License许可:" +license.redistributable());   
  30.   
  31. Trademark [] marks=license.trademarks();   
  32.   
  33. for (Trademark mark:marks){   
  34.   
  35. System.out.println( "商标名称:" +mark.name());   
  36.   
  37. System.out.println( "商标的使用者:" +mark.owner());   
  38.   
  39. }   
  40.   
  41. }   
  42.   
  43. }    
  44.  
分享到:
评论

相关推荐

    Annotation等

    1. **什么是Annotation?** - Annotation是Java 5引入的一种机制,用于在源代码中插入一些元信息,这些信息可以被编译器或JVM用来执行特定的任务,如编译时检查、运行时验证等。 - Annotation不是Java代码的一部分...

    JAVA 标注annotation

    Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...

    Annotation--学习:JDK内建Annotation

    在Java编程语言中,Annotation(注解)是一种元数据,它提供了在编译时和运行时为代码添加信息的方式。注解是自Java 5版本引入的特性,它增强了代码的可读性和可维护性,同时也简化了某些编程任务。在本篇中,我们将...

    map-annotation

    在Java编程领域,注解(Annotation)是一种元数据机制,它允许程序员在代码中嵌入额外的信息,这些信息可以被编译器或者运行时环境读取,以实现各种功能。"map-annotation"是一个特定的注解开发包,主要用于entity类...

    02-Java注解面试题(2题)-新增.pdf

    什么是 Annotation? Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据的途径和方法。Annotation 是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation 对象,然后通过该 ...

    Junit4教程

    什么是Annotation? Annotation是一个Java5中的一种新特性,它允许我们在代码中添加元数据,以描述数据的更多信息。 Annotation可以修饰类名、方法名、变量名等,描述这些数据的更多信息。例如,我们可以使用@...

    自定义的Annotation

    在iOS开发中,Annotation是苹果地图(MapKit)框架中的一个重要概念,用于在地图上添加可视化标记,以展示特定地理位置的信息。自定义的Annotation则允许开发者根据需求个性化地图上的标注,比如添加图片、自定义...

    jakarta.annotation-api-1.3.5-API文档-中文版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    Annotation手册

    7. **元Annotation**:元Annotation是用于定义其他Annotation的Annotation,例如`@Retention`定义Annotation的生命周期(编译时、类加载时或运行时),`@Target`指定Annotation可以应用到哪些程序元素,`@Documented...

    Java Annotation注解.doc

    **为什么使用Annotation?** 1. **减少模板代码**:通过使用注解,开发者可以避免编写大量重复的模板代码,例如在创建JAX-RPC Web服务时,可以使用注解来自动生成接口和实现。 2. **简化配置文件**:某些API需要与...

    Hibernate distribution and annotation

    标题“Hibernate distribution and annotation”涉及到的是Hibernate ORM框架的一个特定版本及其相关的注解功能。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程模型来操作...

    javax.annotation-api-1.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.2.jar; 赠送原API文档:javax.annotation-api-1.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-1.2.pom;...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    javax.annotation-api-1.3.2

    JDK9及以上版本没有javax.annotation-api-***.jar包 ,无法使用注解:@Resource JDK新特性,高版本JDK没有自带的javax(java扩展包)了。或者是使用的JDK不完整。 下载javax.annotation.jar包,导入到lib文件夹下,...

    Annotation技术

    1. **什么是Annotation** Annotation是Java中的注解,它允许程序员在源代码中插入一些元数据,这些元数据可以被编译器、构建工具或者运行时环境用来生成代码、验证代码、配置系统等。它提供了一种安全、可扩展的...

    javax.annotation-api-1.3.2-API文档-中文版.zip

    赠送jar包:javax.annotation-api-1.3.2.jar; 赠送原API文档:javax.annotation-api-1.3.2-javadoc.jar; 赠送源代码:javax.annotation-api-1.3.2-sources.jar; 赠送Maven依赖信息文件:javax.annotation-api-...

    Annotation.zip

    在Android开发中,注解(Annotation)是一种强大的工具,它允许开发者在代码中添加元数据,这些元数据可以在编译时或运行时被解析和处理。`Annotation.zip`可能包含了一个示例,展示了如何利用注解来自动化代码生成...

    annotation-1.1.0.jar

    @androidx.annotation.NonNull 缺失的兼容、androidx.annotation兼容包

    annotation的jar包

    javax.annotation-3.0.jar javax.annotation-3.0.jar javax.annotation-3.0.jar

Global site tag (gtag.js) - Google Analytics