Retention注解

Retention(保留)注解说明,这种类型的注解会被保留到那个阶段. 有三个值:
1.RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
2.RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
3.RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
示例5演示了 RetentionPolicy.RUNTIME 的声明:

Java注解的示例1:

复制代码代码如下:
@Retention(RetentionPolicy.RUNTIME)
public @interface Test_Retention {
   String doTestRetention();
}

在这个示例中, @Retention(RetentionPolicy.RUNTIME)注解表明 Test_Retention注解将会由虚拟机保留,以便它可以在运行时通过反射读取.

结论

本文向你展示了如何通过使用JDK5的注解功能使开发更容易. 注解不直接影响程序的语义. 开发和部署工具可以以某种方式阅读这些注解并处理它们,使用包含注解的程序可以替代额外的Java源文件、XML文档或其他古老的构件.  使用注解可以使用更少的代码完成同样的事情,并且有更好的编译时错误检测机制. 注解的目的是花更少的时间在那些死硬无用的细节中,更多地关注业务逻辑规则.

注解的定义:

注解的定义使用关键词 @interface ,并在上面一行注明@Rentention(arg) 或者@Target(args) , 样例如下:

@Rentention(RetentionPolicy.RUNTIME)

public @interface Annotation01 {

//定义公共的final静态属性

.....

//定以公共的抽象方法

......

}

常见基本内置注解

@Override  当我们想重写一个方法时,在方法上加@Override,当我们方法的名字出错时,编译器就会报错。 定义如下:

@Retention(RetentionPolicy.SOURCE )

Java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事。

Java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
@Override,@Deprecated,@SuppressWarnings为常见的3个注解。
注解相当于一种标记,在程序中加上了注解就等于为程序加上了某种标记,以后,
JAVAC编译器,开发工具和其他程序可以用反射来了解你的类以及各种元素上有无任何标记,看你有什么标记,就去干相应的事。

注解@Override用在方法上,当我们想重写一个方法时,在方法上加@Override,当我们方法
的名字出错时,编译器就会报错,如图:


       注解@Deprecated,用来表示某个类的属性或方法已经过时,不想别人再用时,在属性和方法
上用@Deprecated修饰,如图:

注解@SuppressWarnings用来压制程序中出来的警告,比如在没有用泛型或是方法已经过时的时候,
 如图:

注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS  RUNTIME   SOURCE
用@Retention(RetentionPolicy.CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
用@Retention(RetentionPolicy.SOURCE )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
用@Retention(RetentionPolicy.RUNTIME )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.

    1. package com.self;
    2. import java.lang.annotation.Retention;
    3. import java.lang.annotation.RetentionPolicy;
    4. @Retention(RetentionPolicy.RUNTIME)
    5. public @interface MyTarget
    6. { }
    7. 定义个一注解@MyTarget,用RetentionPolicy.RUNTIME修饰;
    8. package com.self;
    9. import java.lang.reflect.Method;
    10. public class MyTargetTest
    11. {
    12. @MyTarget
    13. public void doSomething()
    14. {
    15. System.out.println("hello world");
    16. }
    17. public static void main(String[] args) throws Exception
    18. {
    19. Method method = MyTargetTest.class.getMethod("doSomething",null);
    20. if(method.isAnnotationPresent(MyTarget.class))//如果doSomething方法上存在注解@MyTarget,则为true
    21. {
    22. System.out.println(method.getAnnotation(MyTarget.class));
    23. }
    24. }
    25. }
    26. 上面程序打印:@com.self.MyTarget(),如果RetentionPolicy值不为RUNTIME,则不打印。
    27. @Retention(RetentionPolicy.SOURCE )
    28. public @interface Override
    29. @Retention(RetentionPolicy.SOURCE )
    30. public @interface SuppressWarnings
    31. @Retention(RetentionPolicy.RUNTIME )
    32. public @interface Deprecated
    33. 由上可以看出,只有注解@Deprecated在运行时可以被JVM读取到
    34. 注解中可以定义属性,看例子:
    35. @Retention(RetentionPolicy.RUNTIME)
    36. public @interface MyAnnotation
    37. {
    38. String hello() default "gege";
    39. String world();
    40. int[] array() default { 2, 4, 5, 6 };
    41. EnumTest.TrafficLamp lamp() ;
    42. TestAnnotation lannotation() default @TestAnnotation(value = "ddd");
    43. Class style() default String.class;
    44. }
    45. 上面程序中,定义一个注解@MyAnnotation,定义了6个属性,他们的名字为:
    46. hello,world,array,lamp,lannotation,style.
    47. 属性hello类型为String,默认值为gege
    48. 属性world类型为String,没有默认值
    49. 属性array类型为数组,默认值为2,4,5,6
    50. 属性lamp类型为一个枚举,没有默认值
    51. 属性lannotation类型为注解,默认值为@TestAnnotation,注解里的属性是注解
    52. 属性style类型为Class,默认值为String类型的Class类型
    53. 看下面例子:定义了一个MyTest类,用注解@MyAnnotation修饰,注解@MyAnnotation定义的属性都赋了值
    54. @MyAnnotation(hello = "beijing", world="shanghai",array={},lamp=TrafficLamp.RED,style=int.class)
    55. public class MyTest
    56. {
    57. @MyAnnotation(lannotation=@TestAnnotation(value="baby"), world = "shanghai",array={1,2,3},lamp=TrafficLamp.YELLOW)
    58. @Deprecated
    59. @SuppressWarnings("")
    60. public void output()
    61. {
    62. System.out.println("output something!");
    63. }
    64. }
    65. 接着通过反射读取注解的信息:
    66. public class MyReflection
    67. {
    68. public static void main(String[] args) throws Exception
    69. {
    70. MyTest myTest = new MyTest();
    71. Class<MyTest> c = MyTest.class;
    72. Method method = c.getMethod("output", new Class[] {});
    73. //如果MyTest类名上有注解@MyAnnotation修饰,则为true
    74. if(MyTest.class.isAnnotationPresent(MyAnnotation.class))
    75. {
    76. System.out.println("have annotation");
    77. }
    78. if (method.isAnnotationPresent(MyAnnotation.class))
    79. {
    80. method.invoke(myTest, null); //调用output方法
    81. //获取方法上注解@MyAnnotation的信息
    82. MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
    83. String hello = myAnnotation.hello();
    84. String world = myAnnotation.world();
    85. System.out.println(hello + ", " + world);//打印属性hello和world的值
    86. System.out.println(myAnnotation.array().length);//打印属性array数组的长度
    87. System.out.println(myAnnotation.lannotation().value()); //打印属性lannotation的值
    88. System.out.println(myAnnotation.style());
    89. }
    90. //得到output方法上的所有注解,当然是被RetentionPolicy.RUNTIME修饰的
    91. Annotation[] annotations = method.getAnnotations();
    92. for (Annotation annotation : annotations)
    93. {
    94. System.out.println(annotation.annotationType().getName());
    95. }
    96. }
    97. }
    98. 上面程序打印:
    99. have annotation
    100. output something!
    101. gege, shanghai
    102. 3
    103. baby
    104. class java.lang.String
    105. com.heima.annotation.MyAnnotation
    106. java.lang.Deprecated
    107. 如果注解中有一个属性名字叫value,则在应用时可以省略属性名字不写。
    108. 可见,@Retention(RetentionPolicy.RUNTIME )注解中,RetentionPolicy.RUNTIME是注解属性值,属性名字是value,
    109. 属性的返回类型是RetentionPolicy,如下:
    110. public @interface MyTarget
    111. {
    112. String value();
    113. }
    114. 可以这样用:
    115. @MyTarget("aaa")
    116. public void doSomething()
    117. {
    118. System.out.println("hello world");
    119. }
    120. 注解@Target也是用来修饰注解的元注解,它有一个属性ElementType也是枚举类型,
    121. 值为:ANNOTATION_TYPE CONSTRUCTOR  FIELD LOCAL_VARIABLE METHOD PACKAGE PARAMETER TYPE
    122. 如@Target(ElementType.METHOD) 修饰的注解表示该注解只能用来修饰在方法上。
    123. @Target(ElementType.METHOD)
    124. @Retention(RetentionPolicy.RUNTIME)
    125. public @interface MyTarget
    126. {
    127. String value() default "hahaha";
    128. }
    129. 如把@MyTarget修饰在类上,则程序报错,如:
    130. @MyTarget
    131. public class MyTargetTest
    132. 注解大都用在开发框架中吧,好了有关注解就学习那么多了,谢谢。  
      1. 本文转自http://blog.csdn.net/liuwenbo0920/article/details/7290586/

java retention注解的更多相关文章

  1. java元注解 @Retention注解使用

    @Retention定义了该Annotation被保留的时间长短: 1.某些Annotation仅出现在源代码中,而被编译器丢弃: 2.另一些却被编译在class文件中,注解保留在class文件中,在 ...

  2. java @Retention元注解

    @Retention元注解 有三种取值:RetentionPolicy.SOURCE.RetentionPolicy.CLASS.RetentionPolicy.RUNTIME分别对应:Java源文件 ...

  3. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  4. JAVA自定义注解

    在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...

  5. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  6. Java 自定义注解

    在spring的应用中,经常使用注解进行开发,这样有利于加快开发的速度. 介绍一下自定义注解: 首先,自定义注解要新建一个@interface,这个是一个注解的接口,在此接口上有这样几个注解: @Do ...

  7. Java Annotation 注解

    java_notation.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin ...

  8. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  9. Java:注解(元数据)

    初识Java注解 所谓的元数据是指用来描述数据的数据,可能刚听到元数据的时候你会有点陌生,其实任何一个使用过struts或者hibernate的开发人员都在不知不觉中使用元数据,更通俗一点来说元数据是 ...

随机推荐

  1. 【原】去掉UltraGrid第三方控件中的Drag a column header here to group by that column

  2. LiteHttp:一款‘智能’的HTTP框架类库

    LiteHttp:一款‘智能’的HTTP框架类库(转自github) 简介 LiteHttp是一款简单.智能.灵活的HTTP框架库,它在请求和响应层面做到了全自动构建和解析,主要用于Android快速 ...

  3. openwrt无线中继教程

    1.设置自己路由lan口的IP地址,网段不能跟上级路由的一样. 2.在无线标签下点击"扫描网络". 3.在新出现的界面中,会列出你附近的无线网络.点击你需要中继的网络右边的&quo ...

  4. VB数据库经典实例总结(一)

    先让大家看一张图.随后讲解..... 敲完五个例子之后的心情是非常好的.并没有想象中的那么难,深究它的话大致思路就是.: 建立数据库 --->利用VB导出数据 --->供人们使用.. 因为 ...

  5. Android学习笔记:TabHost 和 FragmentTabHost(转)

    转自:http://www.cnblogs.com/asion/p/3339313.html   作者:Asion Tang   出处:http://asiontang.cnblogs.com   T ...

  6. TCP协议三次握手、四次断开 过程分析

    建立TCP连接的过程需要进行三次信息交换,通常称为“三次握手”,示意图如下:

  7. c语言变量作用域问题

    c语言中的变量作用域总结 不管什么语言,main好像总是程序的入口,大括号是它的内容:变量的作用域总是困扰着我们,接下来,我们循序渐进的搞明白c语言中的变量作用域,首先得知道c是弱类型的语言,弱类型表 ...

  8. C# 生成二维码并且在中间加Logo

    今天做项目的时候有个在生成二维码并且在中间加入Logo的需求,动手试了几把,总感觉效果没有之前写的好,就翻出旧代码,果然还是熟悉的味道,生成一张效果图如下 左边是微信里面的,右边是我自己生成的 原理比 ...

  9. 7zip 命令行

    转自 http://www.cnblogs.com/langlang/archive/2010/12/01/1893866.html 7z.exe 是 7-Zip 的命令行版本.7z.exe 使用 7 ...

  10. 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

    // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "stdafx.h ...