1. 一、元注解
  2. 元注解的作用就是负责注解其他注解。
  3.  
  4. 1.@Target
  5. @Target用来指明注解所修饰的目标,包括packagestypes(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。
  6.  
  7. 取值(ElementType)有:
  8. CONSTRUCTOR:用于描述构造器
  9. FIELD:用于描述域
  10. LOCAL_VARIABLE:用于描述局部变量
  11. METHOD:用于描述方法
  12. PACKAGE:用于描述包
  13. PARAMETER:用于描述参数
  14. TYPE:用于描述类、接口(包括注解类型) enum声明
  15.  
  16. 例如:
  17.  
  18. Target(ElementType.TYPE)
  19. public @interface AnnotationTest1 {
  20. public String tableName() default "className";
  21. }
  22.  
  23. 表示AnnotationTest1这个注解用来注解类、接口(包括注解类型) enum声明。
  24.  
  25. @Target(ElementType.FIELD)
  26. public @interface AnnotationTest2 {
  27.  
  28. }
  29.  
  30. 表示注解AnnotationTest2用于注解类的成员变量。
  31.  
  32. 2.@Retention
  33. @Retention定义了该Annotation的生命周期,某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取。
  34.  
  35. 取值(RetentionPoicy)有:
  36. SOURCE:在源文件中有效(即源文件保留)
  37. CLASS:在class文件中有效(即class保留)
  38. RUNTIME:在运行时有效(即运行时保留)
  39.  
  40. 例如:
  41.  
  42. @Target(ElementType.FIELD)
  43. @Retention(RetentionPolicy.RUNTIME)
  44. public @interface Column {
  45. public String name() default "fieldName";
  46. public String setFuncName() default "setField";
  47. public String getFuncName() default "getField";
  48. public boolean defaultDBValue() default false;
  49. }
  50.  
  51. 表示Column这个注解用来注解类的成员变量,并且注解一直保留到运行时。
  52.  
  53. 3.@Documented
  54. @Documented的作用是在生成javadoc文档的时候将该Annotation也写入到文档中。
  55.  
  56. 例如:
  57.  
  58. @Target(ElementType.METHOD)
  59. @Documented
  60. public @interface DocumentTest {
  61. String hello();
  62. }
  63.  
  64. 该注解用来修饰成员方法,下面简单的使用;
  65.  
  66. public class DocumentClass {
  67. /**
  68. * this is method of doSomething
  69. */
  70. @DocumentTest(hello = "yahaitt")
  71. public void doSomething() {
  72. System.out.println("do something");
  73. }
  74. }
  75.  
  76. 生成的doc文件中如下:
  77.  
  78. @DocumentTest(hello="yahaitt")
  79. public void doSomething()
  80. this is method of doSomething
  81.  
  82. 4.@Inherited
  83. 我们自定义注解(Annotation)时,把自定义的注解标注在父类上,但是它不会被子类所继承,我们可以在定义注解时给我们自定义的注解标注一个@Inherited注解来实现注解继承。
  84.  
  85. 例如:
  86.  
  87. @Retention(RetentionPolicy.RUNTIME)
  88. @Inherited
  89. public @interface InheritedTest {
  90. String value();
  91. }
  92.  
  93. @InheritedTest("Jadyer")
  94. public class Parent {
  95. @InheritedTest("JavaEE")
  96. public void doSomething() {
  97. System.out.println("Parent do something");
  98. }
  99. }
  100.  
  101. public class Child extends Parent {
  102.  
  103. }
  104.  
  105. public class Test {
  106. public static void main(String[] args) throws SecurityException, NoSuchMethodException {
  107. classTest();
  108. methodTest();
  109. }
  110.  
  111. /**
  112. * 通过反射方式测试子类是否会继承父类中定义在类上面的注解
  113. */
  114. public static void classTest(){
  115. Class<Child> c = Child.class;
  116.  
  117. if (c.isAnnotationPresent(InheritedTest.class)) {
  118. InheritedTest inheritedTest = c.getAnnotation(InheritedTest.class);
  119. String value = inheritedTest.value();
  120. System.out.println(value);
  121. }
  122. }
  123.  
  124. /**
  125. * 通过反射方式测试子类是否会继承父类中定义在方法上面的注解
  126. */
  127. public static void methodTest() throws SecurityException, NoSuchMethodException{
  128. Class<Child> c = Child.class;
  129. Method method = c.getMethod("doSomething", new Class[]{});
  130.  
  131. if (method.isAnnotationPresent(InheritedTest.class)) {
  132. InheritedTest inheritedTest = method.getAnnotation(InheritedTest.class);
  133. String value = inheritedTest.value();
  134. System.out.println(value);
  135. }
  136. }
  137. }
  138.  
  139. 如果父类的注解是定义在类上面,那么子类是可以继承过来的
  140. 如果父类的注解定义在方法上面,那么子类仍然可以继承过来
  141. 如果子类重写了父类中定义了注解的方法,那么子类将无法继承该方法的注解,即子类在重写父类中被@Inherited标注的方法时,会将该方法连带它上面的注解一并覆盖掉
  142.  
  143. 二、Java内建注解
  144. Java提供了三种内建注解
  145. @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
  146. @Deprecated——当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Javajavadoc 中推荐使用该注解,我们应该提供为什么该方法不推荐使用以及替代的方法。
  147. @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE并且被编译器丢弃。
  148.  
  149. 三、自定义注解
  150. 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
  151. 定义注解格式:
  152. public @interface 注解名 {定义体}
  153. 注解参数的可支持数据类型:
  154. 1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  155. 2.String类型
  156. 3.Class类型
  157. 4.enum类型
  158. 5.Annotation类型
  159. 6.以上所有类型的数组
  160.  
  161. Annotation类型里面的参数该怎么设定:
  162. 第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
  163. 第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;  
  164. 第三,如果只有一个参数成员,最好把参数名称设为”value”,后加小括号
  165. 第四,可以在使用default为每个参数设置一个默认值。注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。
  166.  
  167. @Target(ElementType.FIELD)
  168. @Retention(RetentionPolicy.RUNTIME)
  169. @Documented
  170. public @interface FruitName {
  171. String value() default "";
  172. }
  173.  
  174. @Target(ElementType.FIELD)
  175. @Retention(RetentionPolicy.RUNTIME)
  176. @Documented
  177. public @interface FruitColor {
  178.  
  179. public enum Color{ BULE,RED,GREEN};
  180.  
  181. Color fruitColor() default Color.GREEN;
  182.  
  183. }
  184.  
  185. @Target(ElementType.FIELD)
  186. @Retention(RetentionPolicy.RUNTIME)
  187. @Documented
  188. public @interface FruitProvider {
  189. public int id() default -1;
  190.  
  191. public String name() default "";
  192.  
  193. public String address() default "";
  194. }
  195.  
  196. 四、注解的使用
  197.  
  198. public class Apple {
  199. @FruitName("Apple")
  200. private String appleName;
  201.  
  202. @FruitColor(fruitColor=Color.RED)
  203. private String appleColor;
  204.  
  205. }
  206.  
  207. 参数名只有一个,并且设置为value,在对注解使用赋值的时候可以不用加参数名,直接赋值即可。其他情况需要指定参数名和参数值。
  208.  
  209. 五、注解处理
  210. Javajava.lang.reflect 包下新增了AnnotatedElement接口,该接口主要有如下几个实现类:
  211.   Class:类定义
  212.   Constructor:构造器定义
  213.   Field:累的成员变量定义
  214.   Method:类的方法定义
  215.   Package:类的包定义
  216. 所以,AnnotatedElement 接口是所有程序元素(ClassMethodConstructor)的父接口,程序通过反射获取了某个类的AnnotatedElement对象之后,程序就可以调用该对象的如下四个个方法来访问Annotation信息:
  217.  
  218. //返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。
  219. <T extends Annotation> T getAnnotation(Class<T> annotationClass)
  220. //返回该程序元素上存在的所有注解。
  221. Annotation[] getAnnotations()
  222. //判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.
  223. boolean is AnnotationPresent(Class<?extends Annotation> annotationClass)
  224. //返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
  225. Annotation[] getDeclaredAnnotations()
  226.  
  227. 在上面的@Inherited的讲解中也举个相应的例子,我们只需要反射得到ClassMethodConstructor,因为AnnotatedElementClassMethodConstructor的父接口,它们都实现了AnnotatedElement,所以,在ClassMethodConstructor中就可以使用AnnotatedElement中声明的方法来得到注解和注解内容。

Java中的注解基础的更多相关文章

  1. java中的注解(Annotation)

    转载:https://segmentfault.com/a/1190000007623013 简介 注解,java中提供了一种原程序中的元素关联任何信息.任何元素的途径的途径和方法. 注解是那些插入到 ...

  2. 第87节:Java中的Bootstrap基础与SQL入门

    第87节:Java中的Bootstrap基础与SQL入门 前言复习 什么是JQ? : write less do more 写更少的代码,做更多的事 找出所有兄弟: $("div" ...

  3. java中元注解

    java中元注解有四个: @Retention @Target @Document @Inherited:  @Retention:注解的保留位置 @Retention(RetentionPolicy ...

  4. java中的注解详解和自定义注解

    一.java中的注解详解 1.什么是注解 用一个词就可以描述注解,那就是元数据,即一种描述数据的数据.所以,可以说注解就是源代码的元数据.比如,下面这段代码: @Override public Str ...

  5. 第90节:Java中的Linux基础

    第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686 MYSQL依赖包: yum -y install libaio.so ...

  6. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  7. Java中的框架基础面试知识

    spring mvc 工作机制(原理): DispatcherServlet主要用作职责调度工作,本身主要用于控制流程 Spring mvc运行原理 1.springmvc将所有的请求都提交给Disp ...

  8. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  9. 【java】细说 JAVA中 标注 注解(annotation)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...

随机推荐

  1. angularJS指令系统---Directive

    指令:Directive angularJS 有一套完整的,可拓展的,用来帮助web应用开发的指令集: 在建立DOM期间,和HTML关联着的指令会被检测到,并被执行: 在angularJS中将前缀为 ...

  2. rest_framework之规范详解 00

    接口开发 方式1:缺点:如果有10张表,则需要40个url. urls.py views.py 缺点:如果有10张表,则需要40个url.    接下来就出现了resrful 规范,比较简洁 方式2: ...

  3. Centos7更改yum源与更新系统

    [1] 首先备份 /etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cen ...

  4. Python使用logging来记录日志

    #encoding:utf-8 import logging.config from logging.handlers import RotatingFileHandler import Config ...

  5. IIS中User-mode caching引起的Cache-Control不为public的问题

    在IIS的Output caching中如果启用了User-mode caching将引起Cache-Control为no-cache,从而造成页面不能被浏览器或代理服务器缓存. web.config ...

  6. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式

    开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...

  7. 理解Java异常处理机制的机理

    重看异常机制的时候觉得抓到了点机理上的精髓,所以来说一下,对初学者应该会有些帮助   JAVA中的异常机制 从机制上由[产生异常][抛出异常][捕捉异常][异常处理]组成 从形式上又分为四种: 运行时 ...

  8. dp\dpi\px\pt\em单位长度理解

    屏幕都有固定的物理长宽度属性和分辨率 比如电脑.比如手机屏幕 例如有手机屏幕尺寸是1.5英寸x2英寸,屏幕分辨率为240x320, 那么可以推算水平方向每英寸的像素数(dpi)是:240/1.5=16 ...

  9. Ubuntu18.04下安装比特币客户端

    一.下载有两种安装方式:安装包和源码 二.安装1.通过安装包安装在https://bitcoin.org/en/download下载Windows,Mac OSX,Linux对应的安装包.安装过程比较 ...

  10. gcd倒计时

    @interface ViewController () { dispatch_source_t _timer; } @property (weak, nonatomic) IBOutlet UILa ...