`

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提供一种机制,将程序的元素如:类,方法,属性,参数,本地变量,包和元数据联系起来(Sunrise:意思是说 annotation和元素发生了联系,这样代码分析工具,发布工具或者我们自己写的工具或者第三方工具 就可以通过发射机制找到这些注解的值,可能根据这些值能做点什么gua。。。) 。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其它对象可以根据这些元数据来决定如何使用这些程序元素或改变它们的行为。

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

1.定义Annotation

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

Java代码 复制代码 收藏代码
  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. }  
//Example 1

package sz.starbex.bill.annotation;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import java.lang.annotation.ElementType;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface SimpleAnnotation {

String value();

}




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

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

2.使用Annotation

Java代码 复制代码 收藏代码
  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. }  
//Example 2

package sz.starbex.bill.annotation;

import sz.starbex.bill.annotation.SimpleAnnotation;

public class UsingSimpleAnnotation {

@SimpleAnnotation(value="Pass:This method will Pass")//注意name=value的用法

public void pass(){

if(10>5) System.out.println("测试通过");

}

@SimpleAnnotation("Fail:This method will Fail")//注意name=value的用法

public void fail(){

if(10<5) System.out.println("测试失败");

}

}



一个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


Java代码 复制代码 收藏代码
  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. }  
package sz.starbex.bill.annotation;

import sz.starbex.bill.annotation.SimpleAnnotation;

import java.lang.reflect.Method;

public class SimpleAccessAnnotation {

static void accessAnnotationTest(Class usingAnnnotationClass){

try {

//Object usingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance();

Method [] methods=usingAnnnotationClass.getDeclaredMethods();//取得对方法

for(Method method:methods){

System.out.println(method.getName());

SimpleAnnotation 

simpleAnnotation=method.getAnnotation(SimpleAnnotation.class);//得到方法的Annotation

if(simpleAnnotation!=null){

System.out.print(simpleAnnotation.value()+"==");

String result=invoke(method,usingAnnnotationClass);

System.out.println(result);

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

static String invoke(Method m, Object o) {

String result = "passed";

try {

m.invoke(m,new Object[]{});

} catch (Exception e) {

// TODO Auto-generated catch block

result = "failed";

}

return result;

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

accessAnnotationTest(UsingSimpleAnnotation.class);

}

}



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:

Java代码 复制代码 收藏代码
  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. }  
package sz.starbex.bill.annotation;

import java.util.ArrayList;

import java.util.List;

public class SimpleOverrideAnnotation {

public static void main(String[] args) {

SimpleOverrideAnnotation test = new SimpleOverrideAnnotation();

System.out.println(test.toString());

}

@Override

public String toString() {

return "自己的类自己输出";

}

@Deprecated

public void doSomething() {

System.out.println("方法已过时" );

}

@SuppressWarnings(value={"unchecked"})

public void testSuppressWarnings(){

List testList=new ArrayList();

testList.add("KKKK");//没有使用范型,类型不安全

}

}




二、Annotation使用实例

一个组合的Annotation,注释类的

a. 商标Annotation

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

public @interface Trademark {

String name();

String owner();

} 



b.License的annotation

Java代码 复制代码 收藏代码
  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. }   
package sz.starbex.bill.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE, ElementType.PACKAGE})

public @interface License {

String name();

String notice();

boolean redistributable();

Trademark[] trademarks();

} 



c.测试类

Java代码 复制代码 收藏代码
  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. }   
package sz.starbex.bill.annotation;

@License(name="Bill",

notice="许可证",

redistributable=true,

trademarks={@Trademark(name="Mercedes",owner="Swedish"),

@Trademark(name="Daewoo",owner="Korean")

} 

)

public class TestLicenseAnnotation {

public static void main(String[] args) {

TestLicenseAnnotation test=new TestLicenseAnnotation();

License license=test.getClass().getAnnotation(License.class);

System.out.println("License发放人:"+license.name());

System.out.println("License注意事项:"+license.notice());

System.out.println("License许可:"+license.redistributable());

Trademark [] marks=license.trademarks();

for(Trademark mark:marks){

System.out.println("商标名称:"+mark.name());

System.out.println("商标的使用者:"+mark.owner());

}

}

} 



from:http://java.chinaitlab.com/EJB/519586_2.html
分享到:
评论

相关推荐

    Java Annotation的讲解和例子

    Java 注解(Annotation)是Java语言的一个重要特性,它为代码提供元数据,即关于代码的信息,但这些信息不直接影响程序的运行。注解在Java中主要用于编译器检查、运行时处理、框架生成元数据等场景。本篇将深入探讨...

    hibernate-主键生成方式[自动、手动]-annotation

    本文是讲解的是hibernate3.2的主键生成方式,通过annotation来实现,详细的分析了主键在hibernate的生成以及在真实项目的运用。。。。

    JDK1.5的annotation

    标题 "JDK1.5的annotation" 指的是Java Development Kit 1.5引入的注解(Annotation)特性。注解是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器或Java虚拟机(JVM)在编译时或运行时读取和...

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

    ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,...

    Hiberate Annotation学习笔记

    下面将详细讲解 Hibernate 注解的相关知识点。 1. **属性持久化与@Transient** - `@Transient` 注解用于标记不希望被持久化的属性,例如临时变量或计算属性。如果一个属性没有被任何注解标记,那么默认会被视为...

    annotation.zip

    "annon1"可能讲解了如何定义和使用自定义注解,以及如何编写注解处理器来处理这些注解,可能还涉及了处理注解的注解库,如JSR 250的CommonAnnotation。另一方面,"annon2"可能深入到反射的实践应用,包括如何通过...

    hibernate中文APIhibernate annotation 中文API

    "Hibernate_Annotation.chm"则可能是专门针对Hibernate Annotation的中文指南,深入讲解如何使用注解进行数据库映射和操作。 **总结知识点:** 1. Hibernate是一个Java ORM框架,它将Java对象与数据库表对应,简化...

    hibernate_annotation_中文帮助文档

    《Hibernate Annotations中文帮助文档》是针对Java开发人员的一份详细指南,主要讲解如何使用Hibernate ORM框架中的注解来实现数据库对象的映射。该文档涵盖了从基础到高级的各种概念,帮助开发者更高效地管理和操作...

    MLDN学习笔记 —— Annotation

    博文可能会讲解以下几个关键知识点: 1. **注解的定义与分类**:首先,文章可能介绍了注解的基本结构和语法,包括如何定义一个自定义注解。注解可以分为源码级注解、编译时注解和运行时注解,它们在处理时间和作用...

    浙大软件学院培训课件java reflection annotation

    【标题】"浙大软件学院培训课件java reflection annotation"主要涵盖了Java编程语言中的两个重要概念:反射(Reflection)和注解(Annotation)。这两个概念在Java开发中具有深远的影响,尤其是在进行元编程、动态...

    spring学习之五“AOP概念及使用Annotation的实现”

    通过上述讲解,我们可以看出,Spring的注解驱动AOP使我们的代码更加简洁,无需编写大量重复的模板代码。它将关注点分离,提高了代码的可读性和可维护性。同时,结合Spring其他特性,如依赖注入,可以构建出高效、松...

    annotation hibernate struts spring springsecurity API中英文均有

    - **Spring事务详解.pdf**:这份文档深入讲解了Spring框架中的事务管理,包括编程式和声明式事务。 - **Hibernate+Annotation+文档.pdf**:详细介绍了如何使用Hibernate的注解进行对象关系映射。 这些资源可以帮助...

    springboot aspect通过 annotation进行拦截.docx

    在给定的文档中,讲解了如何通过注解(Annotation)来进行AOP拦截。这种方法使得我们可以更灵活地针对特定的业务逻辑进行拦截,而不是对所有方法进行拦截。 1. **注解(Annotation)**:注解是Java语言的一个重要...

    spring-txn-annotation-demo.zip

    下面将详细讲解其中涉及的关键知识点。 1. **Spring框架**:Spring是Java企业级应用的事实标准,它提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,简化了Java开发。在这个项目中,Spring将被用作事务管理的...

    [课堂课件讲解]Java微服务实践-Spring Boot Web篇(下).pptx

    包括 @javax.servlet.annotation.WebServlet、@javax.servlet.annotation.WebFilter、@javax.servlet.annotation.WebListener、@javax.servlet.annotation.ServletSecurity、@javax.servlet.annotation....

    Hibernate Annotation 共享主键一对一双向关联

    本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared Primary Key)。在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享...

    Java开发实战从入门到精通视频教程下载第16章 Annotation.zip

    在本Java开发实战从入门到精通的视频教程中,第16章主要聚焦于Java注解(Annotation)这一核心特性。注解是Java语言提供的一种元数据机制,它为代码提供了额外的信息,这些信息可以被编译器、JVM或者在运行时的工具...

    mybatis学习总结:annotation示例改进

    本篇“mybatis学习总结:annotation示例改进”主要关注的是如何利用MyBatis的注解来优化数据库操作。在现代开发环境中,注解已经成为了简化配置、提高代码可读性的重要工具。以下是关于MyBatis注解使用的一些关键...

    java5.0新特性总结--Annotation系统学习整理笔记

    这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...

Global site tag (gtag.js) - Google Analytics