扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:IT专家网 2008年5月5日
关键字: Annotation java
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接口中的方法有:
你要注意 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
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的定义和语法
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者