JAVA1.5新特性--注解Annotation

来源:互联网 发布:怎么利用淘宝客放单 编辑:程序博客网 时间:2024/06/06 23:54

    主键分类:

    1. 内键注解(基本注解),定义于java.lang包下。

    *限定重写父类的方法:@Override

    *表示已过时:@Deprecated

    *抑制编译器警告:@SuppressWarnings

    1. 元注解,定义于java.lang.annotation包下。

    *@Retention

    *@Target

    *@Documented

    *@Inherited

    1. 自定义注解

    *使用@interface自定义注解

     

    @Override指定方法重写,强制一个子类重写父类的方法。

    只能修饰方法,不能修饰类和成员变量。

    错误提示1:

    The method getObjectInfo() of type Apple must override or implement a suppertype method。

    该方法getObjectInfo()类型的苹果必须重写或实现suppertype方法。

     

    @Deprecated用于表示某个程序元素(类、方法、成员变量等)已过时。

    文档注释中的@deprecated将在后续版本中改进放弃使用。

    当调用Apple类的getObjectInfo方法时,编译器将会给出警告。

     

    @SunppressWarnigs指示被注解表示的程序元素及其子元素取消显示指定的编译器警告。

    会一直作用于该成程序元素的所有子元素。

    @SuppressWarnings("unchecked")

    关键字

    用途

    Deprecation

    使用了不赞成使用的类或方法时的警告

    unchecked

    执行了未检查的转换时的警告,例如当使用集合时                                                                                                                                                            没有用泛型 (Generics) 来指定集合保存的类型。

    fallthrough

    当Switch 程序块直接通往下一种情况而没有 Break 时的警告。

    path

    在类路径、源文件路径等中有不存在的路径时的警告。 

    Serial

     当在可序列化的类上缺少 serialVersionUID 定义时的警告。 

    finally

    任何 finally 子句不能正常完成时的警告。

    Unused

    有程序元素未被使用

    all

    关于以上所有情况的警告。

     

    ===============元注解

    @Target

    1、用于指定被修饰的注解能用于修饰哪些程序元素

    2、@Target注解类型有唯一的value作为成员变量,value的类型为java.lang.annotation.ElementType类型

     

    ElementType.ANNOTATION_TYPE

    注解声明

    ElementType.CONSTRUCTOR    

    构造方法声明

    ElementType.FIELD          

    成员变量声明

    ElementType.LOCAL_VARIABLE 

    局部变量声明

    ElementType.METHOD         

    方法声明

    ElementType.PACKAGE        

    包声明

    ElementType.PARAMETER      

    参数声明

    ElementType.TYPE       

    类、接口(包括注解类型)

    或枚举类声明

     

    @Retention

    1、用于指定被修饰的注解可以保留多长时间。描述了被其修饰的注解是否被编译器丢弃或者保存在class文件中,如果保存在class文件中,是否在class文件被加载时被虚拟机所读取。

    2、默认情况下,注解被保存在class文件中,但在运行时并不能被反射访问。

    3、@Retention包含一个java.lang.annotation.RetentionPolicy的枚举类型的value成员变量,使用@Retention时必须为该value成员变量指定值,通过指定@Retention的value值,就可以指定被修饰的注解可以保留多长时间。

    RetentionPolicy.CLASS   (默认值) 

    编译器将把注解记录在class文件中,当运行java程序时,java虚拟机不再保留注解。程序无法通过反射获取该注解。

    RetentionPolicy.RUNTIME

    编译器将把注解记录在class文件中,当允许java程序时,java虚拟机也会保留注解,程序可以通过反射获取该注解

    RetentionPolicy.SOURCE

    编译器直接丢弃被修饰的注解。

     

    示例:

    指定了@Retention在运行时,可以通过反射访问。

    从这个例子中我们可以看到,@Retention修饰了自己的注解类型定义

     

    @Documented

    1、用于指定被修饰的注解将被javadoc工具提取成文档,

    2、如果定义注解时使用了@Documented修饰,则所有使用该注解的程序元               

          素的API文档中豆浆包含该注解说明;

    3、@Documented注解类型中没有成员变量。

    示例:

     

     

     

    以@SuppressWarnings的部分API文档举例;图中被红框框起来的蓝色字体部分即是@SuppressWarnings中包含的@Target及@Retention,而之所以在这里显示@Target及@Retention,就是因为这两个注解是被@Documented注解所修饰的。

     

    @Inherited

    1、用于指定被修饰的注解将具有继承性

    2、如果某个类使用了定义时被@Inherited修饰的注解,则其子类会自动具有这个注解。

    3、被@Inherited注解修饰的注解是被标注过的类的子类所继承。类并不从它所实现的接口继承该类型的注解,方法也不能从它所重载的方法中继承这种注解。

    4、当被@Inherited修饰的注解的Retention是RetentionPolicy.RUNTIME时,反射API会增强这种继承性。因为如果我们使用java.lang.reflect去查下一个Inherited类型的注解时,反射将展开代码检查工作:检查类及其父类知道泛型指定的注解被发现,或者到达类继承结构的顶层。

     

    ===============自定义注解

    注解类型与接口的差异:

    • 注解类型使用关键字@interface,这个关键字隐含了一个基本的信息,即继
      承了:java.lang.annotation.Annotation接口。

    public @interface Inherited{}

    • 注解类型的方法定义是独特的、受限制的,不同于普通接口中的方法定义,注解类型的方法必须声明为无参数、无异常抛出的。注解类型中的方法即为主角类型的成员变量。

    String[] value;

    • 方法名就是成员变量名,

    value

    • 方法返回值即为成员变量的类型,

    String[]

    • 方法的后面可以使用default关键字和一个默认数值来声明成员变量的默认值,而空不能作为默认值。 这与我们在非注解类的接口中定义方法有很大的不同。

    注解类型与接口的像是之处:

    • 都可以定义接口常量、静态成员类型(如枚举类型定义)。注解类型也可以像接口一样被实现或继承。

     

    注解类型是一种接口,但它又不同于接口,如何自定义注解类型:

    1、使用@interface关键字;

    2、使用注解时类似与public、final这样的修饰符。

    3、可用于修饰类、接口、方法、成员变量等程序元素。

     

    使用注解时的规范:

    1、把注解放在所有修饰符之前;

    2、把注解单独放在一行;

     

    注解也可以带成员变量:

    注解的成员变量在注解类型的定义中以无参数方法的形式来声明,其方法名和返回值分别定义了该成员变量的名字和类型。

    示例:(value变量单个值

     public @interface AnnotationTest{

    //定义一个成员变量value

    //注解类型中的成员变量以方法的形式定义

    String value();//--变量名为value,类型为String

    }

     

    示例:(value变量多个值

     public @interface AnnotationTest{

    //定义多个成员变量value

    //注解类型中的成员变量以方法的形式定义

    String[] value();//--变量名为value,类型为String

    }

       

    示例:(多个成员变量

     public @interface AnnotationTest{

    //定义两个成员变量value

    //注解类型中的成员变量以方法的形式定义

    String name();//--变量名为value,类型为String

    int age();

    }

     

    使用定义了成员变量的注解时要为成员变量赋值:

    示例:

    Public class MyAnnotation{

    //使用带成员变量的注解时,需要为成员变量赋值

    @AnnotationTest(name="jack",age=20)

    Public void getObjectInfo(){

    ……

    }

    }

     

    使用default关键字为注解类型的成员变量指定初始值:

    示例:

    Public @interface AnnotationTest{

    //定义两个成员变量name和age

    //用default关键字为两个成员变量赋初始值

    String name() default "jack";

    int age() default 20;

    }

     

    如果注解类型的成员变量被指定了初始值,则在使用该注解时不对成员变量赋值也可以:

    示例:

    Public class MyAnnotation{

    //使用带有初始值的成员变量的注解时,可以不为成员变量赋值

    @AnnotationTest

    Public void getObjectInfo(){
    .…..

    }

    }

     

    ===============自定义注解分类

    根据注解类型是否包含成员变量,可以注解分为两类:

    *标记注解

    • 没有定义成员变量的注解类型被称为标记注解,这种注解仅使用自身的存在与否,来为我们提供信息。

    示例:

    @Override---内建注解

    @Document---元注解

    *元数据注解

    • 包含成员变量的注解,因为他们可以接受更多的元数据,所以被称为元数据注解。

    示例:

    @SuppressWarnings---内建注解

    @Target---元注解

     

     


0 0
原创粉丝点击