转----------

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. 注解大都用在开发框架中吧,好了有关注解就学习那么多了,谢谢。

Java注释@interface的用法的更多相关文章

  1. Java注释@interface的用法【转】

    Java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类.@Override,@Deprecated,@SuppressWarnings为 ...

  2. Java注释@interface的用法【转】 --好文章 很好理解

    java用  @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类. @Override,@Deprecated,@SuppressWarnings ...

  3. java中自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  4. [转]自定义注释@interface的用法

    一.什么是注释     说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...

  5. Java annotation 自定义注释@interface的用法

    最近看到很多项目都是用了自定义注解,例如 1.什么是注解? 元数据(metadata),就是指数据的数据,元数据是描述数据的,就像数据库中的,表的字段,每一个 字段描述这个字段下面·的数据的含义,j2 ...

  6. Java 自定义注释@interface的用法

    最简单的待校验的注解定义 @Documented @Constraint(validatedBy = ExistBlankByListValidator.class) @Target({PARAMET ...

  7. JAVA注释的另一种神奇用法

    每个JAVA程序员在写程序的时候一定都会用到注释,本篇博客不是讲怎么定义注释,而是说明注释神奇的一种写法. /** * 这是一个测试类 */ public class Test { /** * 程序的 ...

  8. 转:十八、java中this的用法

    http://blog.csdn.net/liujun13579/article/details/7732443 我知道很多朋友都和我一样:在JAVA程序中似乎经常见到“this”,自己也偶尔用到它, ...

  9. 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

随机推荐

  1. vim 编辑器的设置

    vi编辑器的配置:http://blog.mcuol.com/User/fenghua/Article/17411_1.htm ******************************vim ~/ ...

  2. Android学习笔记(十五)——实战:强制下线

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 实现强制下线功能的思路也比较简单,只需要在界面上弹出一个对话框, 让用户无法进行任何其他操作, 必须要点击对话 ...

  3. 小白死去活来的安装ros_qtc_plugin

    在距离写上一篇有关ROS的文章已经过去了很久了.在这段时间内一直在积累,盼望着能够厚积薄发,但还是被无情的社会折磨的死去活来,深深的体会到了一般学校和重点学校找工作的差别,以及用人单位的区别对待.说到 ...

  4. net-snmp配置文件详解

    net-snmp配置文件详解 net-snmp的配置文件是有一定的层次结构的,配置起来也很方便.网上找了很多资料,大概把这个配置文件的各个信息搞懂了一点.其实在net-snmp的EXAMPLE.con ...

  5. phpcms--模型管理,推荐位管理,类别管理

    phpcms的默认设置不一定能满足需求,这个时候必须启用[模型管理],[推荐位管理],[类别管理]三个高级功能 为什么需要使用这些功能呢,因为后台添加内容的时候需要不同的模型 而模型通过什么来展现呢, ...

  6. espcms列表页ajax获取内容 - 并初始化swiper

    <link rel="stylesheet" href="swiper.min.css" type="text/css" media= ...

  7. 【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理

    近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work. 1.网络拓扑 拓扑如下:(点开看大图)  容器网卡通过docker0桥接到flannel0网卡,而每个 ...

  8. 《oracle每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句

    触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句 在触发器中不能运行 ddl语句和commit,rollback语句 ddl语句:DDL语句用语定义和管理数据库中的对象,如Creat ...

  9. IPC----哲学家就餐问题(并发与互斥)

    哲学家就餐问题描述: 5个哲学家,5个筷子.5个哲学家围坐在一张桌子上,筷子放在分别放在每个哲学家的两旁.如果所有哲学家在某个时刻同时拿起左边的筷子,那么右边的筷子就都被其他的哲学家拿了,造成大家都无 ...

  10. c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

    Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel ...