java注解详解

来源:互联网 发布:淘宝客服怎么认证 编辑:程序博客网 时间:2024/05/20 09:27

java注解详解
code_xzh2016-10-18 19:17:42 浏览1253评论0

android前端与交互设计 java

摘要:  自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。 那么什么是注解呢?举一个简单的例子。 [html] v

 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

那么什么是注解呢?举一个简单的例子。

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public String toString() {  
  3.     return "This is String Representation of current object.";  
  4. }  
toString()方法使用了@Override注解。但是,即使我不使用@Override注解标记代码,程序也能够正常执行。@Override告诉编译器这个方法是一个重写方法(元数据),如果父类中不存在该方法,编译器便会报错,提示该方法没有重写父类中的方法。如果我们不小心将toString()写错了,并且没有加@Override注解标签,编译器是会报错的。

Annotation是一种应用于类、方法、参数、变量、构造器及包声明中的特殊修饰符。它是一种由JSR-175标准选择用来描述元数据的一种工具。

Aninotation遵循一个基本原则:不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一的执行。

这里提到了元数据,那么什么是元数据。

元数据:关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。

综上所述:
    第一,元数据以标签的形式存在于Java代码中。
    第二,元数据描述的信息是类型安全的,即元数据内部的字段都是有明确类型的。
    第三,元数据需要编译器之外的工具额外的处理用来生成其它的程序部件。
    第四,元数据可以只存在于Java源代码级别,也可以存在于编译之后的Class文件内部。

注解的作用(优点和缺点):

编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。

正式由于上面的特点,使我们在开发中也出现一些问题,入出现问题没办法快速定位错误,调试难度加大。但是这也不影响我们队注解的使用。

注解分类

根据注解参数的个数,我们可以将注解分为三类:

1.标记注解:一个没有成员定义的Annotation类型被称为标记注解。这种Annotation类型仅使用自身的存在与否来为我们提供信息。比如后面的系统注解@Override;
2.单值注解
3.完整注解

根据注解使用方法和用途,我们可以将Annotation分为三类:
1.JDK内置系统注解
2.元注解
3.自定义注解。

系统内置的常用的注解:

@Override:用于修饰此方法覆盖了父类的方法;
@Deprecated:用于修饰已经过时的方法;
@SuppressWarnnings:用于通知java编译器禁止特定的编译警告。


注解修饰

注解也可以添加注解的“注解”去修饰,J2SE5.0版本在 java.lang.annotation提供了四种元注解,专门注解其他的注解:

@Documented –注解是否将包含在JavaDoc中
@Retention –什么时候使用该注解
@Target? –注解用于什么地方
@Inherited – 是否允许子类继承该注解

@Documented–一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。


@Retention– 定义该注解的生命周期。
RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。


@Target – 表示该注解用于什么地方。如果不明确指出,该注解可以放在任何地方。以下是一些可用的参数。需要说明的是:属性的注解是兼容的,如果你想给7个属性都添加注解,仅仅排除一个属性,那么你需要在定义target包含所有的属性。


ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD
ElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE 另一个注释
ElementType.PACKAGE 用于记录java文件的package信息

@Inherited – 定义该注释和子类的关系

说了这么多,我们来自己定义注解吧

注解例子

自定义注解:


[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. /**  
  2. SOURCE : 编译程序时处理完Annotation信息后就完成任务  
  3. CLASS: 编译程序将Annotation存储于class文件中,不可以由虚拟机读入  
  4. RUNTIME: 编译程序将Annotation存储于class文件中,可以由虚拟机读入  
  5.  */  
  6. @Target(ElementType.TYPE)  
  7. @Retention(RetentionPolicy.RUNTIME)  
  8. @Documented  
  9. public @interface TestAnnotation {  
  10.     //无参数  
  11.     String value();  
  12.     //有默认值的注解  
  13.     String defaultValue() default "";  
  14.     //枚举参数  
  15.     TestEnum testenum();  
  16. }  

枚举类:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public enum TestEnum {  
  2.     CANCEL {public String getName() {return "cancel";}},  
  3.     WAITE {public String getName() {return "waite";}},  
  4.     OK {public String getName() {return "ok";}},  
  5. }  
测试

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. @TestAnnotation(value="value",defaultValue="test",testenum=TestEnum.CANCEL)  
  2. public class Test {  
  3.     public static void main(String[] args) {  
  4.         TestAnnotation annotation=Test.class.getAnnotation(TestAnnotation.class);  
  5.         System.out.println("annotation---"+annotation);  
  6.     }  
  7. }  
原创粉丝点击