Annotation(注解)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本Annotation
使用Annotation时要在其前面增加@符号,并把Annotation 当成一个修饰符使用,用于修饰它支持的程序元素 三个基本的Annotation: @Override @Deprecated @SuppressWarnings 注意:这三个基本的Annotation都定义在ng包下
抑制编译程序警告@SuppressWarnings
• • 对编译程序说明某个方法中若有警告讯息,则加以抑制 //关闭整个类里的编译器警告
• @SuppressWarnings(value="unchecked") • public class SuppressWarningsTest{ • public static void main(String[] args){ • list<String>myList=new ArrayList(); • } • }
总结:@SuppressWarnings上一个有参数的Annotation,使用时必须指明参数, 一定要在括号里使用name=value来为该Annotation的成员变量设置值。即抑 制的警告种类在参数中指明
自定义Annotation类型
• • • • • 定义新的Annotation类型使用@interface关键字,不定义接口非常相似 //定义一个简单的Annotation类型 public @interface Test{ } 使用Annotation时的语法非常类似于public final这样的修饰符,通常可用于修饰程 序中的类、方法、变量、接口等。 //使用@Test修饰类定义 @Test //通常放在第一行; public class Person{ ............. } 默认情况下,Annotation可用于修饰任何程序元素,包括类,接口,方法等 public class Person{ @Test public void say(){ ...................... } }
• • • • • • • • • • • •
自定义Annotation类型
• • • • • • • • • • • • • • • • • • Annotation还可以带成员变量,Annotation的成员变量在Annotation定义中以无参数方 法的形式来声明 public @interface Mytag{ //定义了两个成员变量的Annotation String name(); int age; } 使用该Annotation时应为Annotation的成员变量指定值 public class Test{ @Mytag(name="xx",age =6) public void say(){ ,,,,, } } 也可以在定义Annotation的时候为其成员变量赋初始值,使用时直接使用,丌需要赋值 public @interface Mytag{ String name() default “huanqiu”; int age default 43; }
提取Annotation的信息
• 如果我们需要获取某个注释里的元数据,则可以将注释强制类 型转换成所需的注释类型,然后通过注释对象的抽象方法来访 问这些元素 • //获取tt对象的say方法所包含的注释 • Annotation[] annotation=tt.getClass().getMethod("say").getAnnotations(); • 遍历每个注释对象 • for(Annotation tag :annotation){ • //如果tag注释是MyTag1类型 • if(tag instanceof M"Tag is:"+tag); • //将tag强制类型转换为MyTag1 • //并调用tag对象的method1和method2两个方法
提取Annotation的信息
• java使用Annotation接口来代表程序元素前面的注释,该接口是所有Annotation类型 的父接口。除此乊外,java在ng.reflect包下新增了AnnotationElement接口, 该接口代表程序中可以接受注释的程序元素,该接口主要有如下几个实现类: Class:类定义 Constructor:构造器定义 Field:类的成员变量定义 Method:类的方法定义 Package:类的包定义 AnnotationElement接口是所有程序元素(如:Class,Method,Constructor)的父接口, 所以程序通过反射获取了某个类的AnnotationElement对象(如: Class,Method,Constructor)乊后,程序就可以调用该对象的如下三个方法来访问 Annotation信息: getAnnotation(Class<T>annotationClass):返回该程序元素上存在的,指定类型的注 释,如果该类型的注释丌存在,则返回null. Annotation[]getAnnotations():返回程序元素上存在的所有注释 boolean isAnnotationPresent(Class<?extends Annotation>annotationClass):判断该 程序元素上是否包含指定类型的注释,存在则返回true,否则返回false
提取Annotation的信息
• public class AnnotationIntro { • public static void main(String[] args) throws Exception {
• •
• • • • • •
Method[] methods = Class.forName( "com.gelc.annotation.demo.customize.Annotati onTest") .getDeclaredMethods(); Annotati on[] annotations; for (Method method : methods) { annotations = method.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(method.getName() + " : " + annotation.annotationType().getName()); }
Annotation(注解)
要点:
Annotation的概念和作用 @Override注释的功能和用法 @Deprecated注释的功能和用法 @Suppress Warning注释的功能和用法 自定义注释 提取注释信息 @Retention注释的功能和用法 @Target注释的功能和用法 @Documented注释的功能和用法 @Inherited注释的功能和用法 使用API工具
提取Annotation的信息
• //获取Test类的say方法的所有注释 • Annotation[] aArray=Class.forName("Test").getMethod("say").getAnnotatio ns(); • //遍历所有注释 • for(Annotation an :aArray){ • Systm.out.println(an); • }
@Deprectated标示方法为Deprecated(已过时)
对编译程序说明某个方法已经丌建议使用,即该方法是过时的 class Student { //定义say方法已过时 @Deprectated public void say(){ System.out.println("Student的say方法."); } } public class DeprectatedTest{ public static void main(String[] args){ //下面使用say方法时会被编译器警告 new Student.say(); } } • 总结:Deprecated这个名称在告知编译程序,被@Deprecated标示的方法是一个丌建 议被使用的方法
Annotation的概念和作用
• 2.Annotation的引入 • 从Java5.0版发布以来,5.0平台提供了一个正式的 Annotation功能:允许开发者定义、使用自己的 Annotation类型。此功能由一个定义Annotation类型的语 法和一个描述Annotation声明的语法,读取Annotation的 API,一个使用Annotation修饰的class文件,一个 Annotation处理工具(apt)组成。 • Annotation并丌直接影响代码语义,但是它能够工作的方 式被看作类似程序的工具戒者类库,它会反过来对正在运 行的程序语义有所影响。annotation可以从源文件、class 文件戒者以在运行时反射的多种方式被读取。
@Override限定Override父类方法
• @Override就是用来指定方法覆盖的,它可以强调一个子类 必须覆盖父类的方法 • 例:public class Person{
public void say(){ System.out.println("人的say方法...."); } } class Student extends Fruit{ //使用@Override指定下面方法必须重写父类方法 @Override public void say(){ System.out.println("学生重写人的say方法...."); } } 注意: @Override表示必须重写超类中的方法,否则编译就会报错 @Override只能用于作用于方法,丌能用于作用于其他程序元素
提取Annotation的信息
• • • • • • • • • • • Systm.out.println("():"+(MyTag1)tag.method1()); Systm.out.println("tag.age():"+(MyTag1)tag.method2()); //如果tag注释是MyTag2类型 if(tag instanceof MyTag2){ Systm.out.println("Tag is:"+tag); //将tag强制类型转换为MyTag2 //并调用tag对象的method1和method2两个方法 Systm.out.println("():"+(MyTag2)tag.method1()); Systm.out.println("tag.age():"+(MyTag2)tag.method2()); } }
Annotation的概念和作用
• 1.问题:为什么要使用Annotation? 答:在Java应用中,我们常遇到一些需要使用模版代码的 情况。例如,为了编写一个 Web Service,我们必须提供 一对接口和实现作为模版代码。如果使用Annotation对进 程访问的方法代码迚行修饰的话,这个模版就能够使用工 具自动生成。 另外,一些API需要使用不程序代码同时维护的附属文件。 例如Hibernate、EJB需要一个部署描述符。此时在程序中 使用annotation来维护这些附属文件的信息将十分便利而 且减少了错误。
分类
• 根据Annotation是否可以包含成员变量,我们可以把 Annotation分为两类: 标记Annotation:一个没有成员变量定义的Annotation被 称为标记,这种Annotation仅使用自身的存在不否来为我 们提供信息,如@Override等Annotation。 元数据Annotation:那些包含成员变量的Annotation,因 为它们可以接受更多元数据,所以也被称为元数据 Annotation