`
oboaix
  • 浏览: 269101 次
社区版块
存档分类
最新评论

Java中的Annotation解析之一(1)(转载)

阅读更多

Java中的Annotation解析之一(1)

<script language="javascript" src="http://www.51cto.com/php/ajax_art_2.js"></script>

关 键 词:Annotation  Java
阅读提示:在已发布的JDK1.5(tiger)中增加新的特色叫 Annotation。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对...)”

//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

//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 extends="" annotation=""></t><t extends="" annotation=""></t>T getAnnotation(Class<t></t> 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

(续 : http://www.51cto.com/html/2006/0413/25310.htm)

 

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);

}

}

以上是简单的简绍Annotation,让大家对Annotation有一个初步的了解,下面二会简绍Annotation的定义和语法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics