《CoreJava系列讲座之Annota.ppt》由会员分享,可在线阅读,更多相关《CoreJava系列讲座之Annota.ppt(13页珍藏版)》请在三一办公上搜索。
1、Core Java系列讲座之,Annotation,什么是Annotation?,Annotation是JDK1.5中新增的特色,它提供了一种机制,将程序元素如:方法,属性,参数,本地变量,包和元数据联系起来。这样编译器可以将元数据存储在Class文件中。这样虚拟机和其他对象可以根据这些元数据来决定如何使用这些程序元素或改变他们的行为。,Annotation的语法是?,1、类型声明方式annotation的类型声明和一般的接口声明极其相似,区别是它在interface关键字面前使用符号。注意:1)annotation类型并不是程序必须定义的类型2)方法返回值的类型被限制在以下范围:primit
2、ives、String、Class、enums、annotation和前面类型的数组;方法可以有默认值。,举个annotation类型声明的例子,package;import;import;import;import;Retention(RetentionPolicy.RUNTIME)Target(ElementType.METHOD)publicinterfaceSimpleAnnotationStringvalue();Retention这个meta-annotation表示我们创建的SimpleAnnotation这个Annotation将会存储在Class文件中,并在java VM运行
3、时加载它。Target这个meta-annotation表示我们创建的SimplwAnnotation将会为描述方法,而 interface SimpleAnnotation是我们自定义的Annotation,它有一个成员叫value,返回值是String。,怎样使用Annotation?,/package;import;publicclassUsingSimpleAnnotationSimpleAnnotation(value=Pass:ThismethodwillPass)/注意name=value的用法publicvoidpass()if(105)(测试通过);SimpleAnnotat
4、ion(Fail:ThismethodwillFail)/注意name=value的用法publicvoidfail()if(10=0,当只有一个单一的成员时,这个成员就是value。我们也可以这样写 SimpleAnnotation(Fail:This method will Fail)。至此SimpleAnnotation将Pass和Fail联系起来了。,在运行时访问Annotation,一旦Annotation与程序元素联系起来,我们可以通过反射访问它们并可以取得它们的值。我们使用一个新的interface:。接口中 的方法有:a.boolean isAnnotationPresent(
5、Class annotationType)如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。b.T getAnnotation(Class annotationType)如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。c.Annotation getAnnotations()返回此元素上存在的所有注释。d.Annotation getDeclaredAnnotations()返回直接存在于此元素上的所有注释。你要注意 isAnnotationPresent和getAnnotation方法,它们使用了Generics,请参考我的Java 范型的Blog
6、。下面我们列出一些实现了AnnotatedElement 接口的类 1.2.3.4.5.6.,下面的Example程序说明了如何在运行环境访问Annotation,package;import;import;publicclassSimpleAccessAnnotationstaticvoidaccessAnnotationTest(ClassusingAnnnotationClass)try/ObjectusingAnnnotationClass=Class.forName(usingAnnotationClassName).newInstance();Methodmethods=using
7、AnnnotationClass.getDeclaredMethods();/取得对方法for(Methodmethod:methods)System.out.println(method.getName();SimpleAnnotationsimpleAnnotation=method.getAnnotation(SimpleAnnotation.class);/得到方法的Annotationif(simpleAnnotation!=null)System.out.print(simpleAnnotation.value()+=);Stringresult=invoke(method,usi
8、ngAnnnotationClass);System.out.println(result);catch(Exceptione)/TODOAuto-generatedcatchblocke.printStackTrace();,下面的Example程序说明了如何在运行环境访问Annotation(cont.),staticStringinvoke(Methodm,Objecto)Stringresult=passed;trym.invoke(m,newObject);catch(Exceptione)/TODOAuto-generatedcatchblockresult=failed;retu
9、rnresult;/*paramargs*/publicstaticvoidmain(Stringargs)/TODOAuto-generatedmethodstubaccessAnnotationTest(UsingSimpleAnnotation.class);,Java 中的Annotation的定义,Java中的Annotation Java定义了几个标准的meta-annotation,在新Package中 中包含了以下meta-annotation:meta-annotation 说明 Target 1.annotation的target是一个被标注的程序元素。target说明了a
10、nnotation所修饰的对象范围:annotation可被用于 packages、types(类、接口、枚举、annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循 环变量、catch参数)。在annotation类型的声明中使用了target可更加明晰其修饰的目标。,Java 中的Annotation的定义,2.ElementType的定义 TYPE/Class,interface,or enum(but not annotation)FIELD/Field(including enumerated values)METHOD/Method(do
11、es 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/将注释保留在编译后的类文件中,
12、并在第一次加载类时读取它 Documented Documented 表示注释应该出现在类的 Javadoc 中 Inherited 一个Annotation将被继承,三个标准的Annotation,在java.lang包中:Deprecated 对不再使用的方法进行注释 Override 指明注释的方法覆盖超类的方法 SuppressWarnings 阻止编译器的警告,例:当类型不安全时,下例来说明这三个标准的Annotation:,package;import;import;publicclassSimpleOverrideAnnotationpublicstaticvoidmain(St
13、ringargs)SimpleOverrideAnnotationtest=newSimpleOverrideAnnotation();System.out.println(test.toString();OverridepublicStringtoString()return自己的类自己输出;DeprecatedpublicvoiddoSomething()(方法已过时);SuppressWarnings(value=unchecked)publicvoidtestSuppressWarnings()ListtestList=newArrayList();testList.add(KKKK);/没有使用范型,类型不安全,结束啦!,谢谢大家!,