• 1. Core Java系列讲座之————Annotation
  • 2. 什么是Annotation?Annotation是JDK1.5中新增的特色,它提供了一种机制,将程序元素如:方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其他对象可以根据这些元数据来决定如何使用这些程序元素或改变他们的行为。
  • 3. Annotation的语法是?1、类型声明方式 annotation的类型声明和一般的接口声明极其相似,区别是它在interface关键字面前使用@符号。 注意: 1)annotation类型并不是程序必须定义的类型 2)方法返回值的类型被限制在以下范围:primitives、String、Class、enums、annotation和前面类型的数组;方法可以有默认值。
  • 4. 举个annotation类型声明的例子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。
  • 5. 怎样使用Annotation? //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联系起来了。
  • 6. 在运行时访问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
  • 7. 下面的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();   }    }  
  • 8. 下面的Example程序说明了如何在运行环境访问Annotation(cont.)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);   }   }  
  • 9. 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可更加明晰其修饰的目标。
  • 10. Java 中的Annotation的定义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将被继承
  • 11. 三个标准的Annotation在java.lang包中: @Deprecated 对不再使用的方法进行注释 @Override 指明注释的方法覆盖超类的方法 @SuppressWarnings 阻止编译器的警告,例:当类型不安全时
  • 12. 下例来说明这三个标准的Annotation: 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");//没有使用范型,类型不安全   }   }  
  • 13. 结束啦!谢谢大家!