在创建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 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
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的定义和语法。
作者:管斌(http://blog.matrix.org.cn/page/guanbing)
原文地址:http://www.matrix.org.cn/resource/article/44/44336_Java+Annotation.html
(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)