`
NumberWen
  • 浏览: 30841 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

java1.5新特性Annotation

阅读更多

在创建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. }  

 

@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. }  

 

一个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. * @param args
  69. */  
  70.   
  71. public static void main(String[] args) {   
  72.   
  73. // TODO Auto-generated method stub   
  74.   
  75. accessAnnotationTest(UsingSimpleAnnotation.class);   
  76.   
  77. }   
  78.   
  79. }  

 

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. }  

 

二、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. }   

 

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. }   

 

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. }   
分享到:
评论

相关推荐

    jdk1.5新特性

    类型安全的枚举是在 Java 1.5 中引入的另一种新特性,它为枚举类型提供了更好的类型安全性和灵活性。类型安全的枚举不仅避免了使用常量接口所带来的问题,还允许为枚举类型定义方法。 **示例对比:** 传统方式下,...

    JDK1.5新特性

    **JDK 1.5 新特性详解** JDK 1.5,也称为Java SE 5.0,是Java发展历程中的一个重要里程碑,...以上就是JDK 1.5及1.7版本引入的关键新特性,它们极大地改善了Java编程体验,为开发者带来了更高的生产力和更健壮的代码。

    java1.5 annotation注释源代码

    Java 1.5 引入了一种新的元编程机制——注解(Annotation),极大地增强了代码的可读性和可维护性。注解是一种在代码中添加元数据的方式,它允许程序员在源代码上添加一些信息,这些信息可以被编译器或运行时环境...

    JAVA_API1.5.rar_java1.5 api

    Java 1.5,也被称为Java 5.0,是一个重要的Java开发平台版本,它引入了许多新特性,改进了已有的API,并提升了编程效率。Java 2 Platform Standard Edition(J2SE)5.0是Java SE平台的一个里程碑,为开发者提供了更...

    JDK1.5的annotation

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

    jdk1.5 tiger java5 新特性

    总的来说,JDK 1.5(Java 5.0)的新特性极大地提高了Java的生产力和代码质量。从泛型到增强的for循环,再到注解和枚举,这些改进都让Java开发者能够编写出更安全、更易于维护的代码。在实际开发中,理解并充分利用...

    java jdk1.5

    这个版本在2004年发布,引入了许多新特性和改进,极大地提升了Java的开发效率和性能。下面我们将深入探讨JDK 1.5的关键知识点。 一、泛型(Generics) Java 1.5引入了泛型,允许开发者在类、接口和方法中定义类型...

    jdk1.5的新特性

    Java 1.5,也称为Java 5.0,引入了一系列重要的新特性,极大地改进了编程体验和代码的可读性。以下是对这些特性的详细解释: 1. 泛型(Generic): 泛型是Java 1.5的一大亮点,它允许在类、接口和方法中使用类型...

    Java虚拟机1.5

    Java虚拟机1.5,也称为Java 5.0,是一个里程碑式的版本,它引入了许多重要的改进和新特性,旨在提高性能、可移植性和开发效率。以下是关于Java虚拟机1.5的一些关键知识点: 1. **泛型**:Java 5.0引入了泛型,允许...

    JDK1.5新特性之注解功能(实例讲解)[文].pdf

    Java注解(Annotation)是JDK 1.5引入的一项重要特性,它的出现极大地简化了代码,特别是对于元数据的处理。元数据是关于数据的数据,它可以提供额外的信息,但不直接影响程序的运行。注解就是一种声明式编程,允许...

    java新特性简介.ppt

    Java语言的不断发展带来了许多新特性,使得编程更加高效和安全。以下是这些特性的详细说明: 1. **自动装箱、拆箱**: 自动装箱是指将基本数据类型自动转换为对应的包装类对象,而拆箱则是将包装类对象转换回基本...

    jdk1.5、1.6压缩包

    JDK 1.5(2004年发布)是Java发展的一个重要里程碑,引入了许多新特性,极大地提升了开发效率和代码质量。以下是一些关键的更新: 1. **泛型**:泛型允许在类、接口和方法中使用类型参数,增强了类型安全,减少了...

    什么是Annotation?

    在Java 1.5版本中引入了一个重要的新特性——**Annotation**(注解)。Annotation本质上是一种元数据(即关于数据的数据),它提供了一种机制来关联程序元素(如类、方法、属性等)与其附加信息。 在早期的Java开发...

    Java实战篇:设计自己的Annotation

    Annotation是Java 1.5引入的新特性,用于向代码中添加元数据。它们可以用于各种目的,例如提供编译时的额外信息、指导工具行为等。为了创建和使用自定义Annotation,需要了解以下关键概念: 1. **@interface**:...

    Annotation(注解)详细教程,jdk新特性

    Annotation(注解)是Java编程语言的一个重要特性,自JDK 1.5引入以来,逐渐成为编写可维护和可扩展代码的关键工具。注解提供了一种方式,使得程序员可以在代码中添加元数据(metadata),这些数据不直接影响代码...

    Java自定义注解Annotation的使用

    自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,使得开发变得更加简洁高效。随着时间的推移,这种“零...

    java api 资源

    Java 1.5(也称为Java 5.0)是一个重要的版本,引入了许多新特性,增强了语言的效率和可读性。在Java 1.5 API中,我们能看到许多关键的变化和新增的类库。 1. **泛型**:这是Java 1.5最重要的特性之一。泛型允许在...

Global site tag (gtag.js) - Google Analytics