一、基本元注解:    

  @Retention:

    说明这个注解的生命周期

    RetentionPolicy.SOURCE -> 保留在原码阶段,编译时忽略

    RetentionPolicy.CLASS -> 保留在编译阶段,不会被加载到jvm

    RetentionPolicy.RUNTIME -> 加载到jvm运行中  

  @Target:

    指明注解运用之处

    ElementType.Type -> 作用于类、接口、枚举

    ElementType.FIELD -> 属性

    ElementType.METHOD -> 方法

    ElementType.PARAMETER -> 方法的参数

    ElementType.CONSTRUCTOR -> 构造方法

    ElementType.LOCAL_VARIABLE -> 局部变量

    ElementType.ANNOTATION_TYPE -> 作用于注解

    ElementType.PACKAGE -> 作用于包

    ElementType.TYPE_PARAMETER

    ElementType.TYPE_USE

  @Documented:

    表示文档  

  @Inherited:

    表示继承,作用在父类时子类可以拥有父类的注解

  @Repeatable:

    表明标记的注解维护一个容器,并且可以多次应用于相同的属性或声明

    容器注解:

       

    具体注解:

         

     作用于方法:

         

二、注解的属性:

  1、注解只有成员变量,没有方法。注解的成员变量在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该成员变量的名字,其返回值定义了该成员变量的类型。

  2、属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。数组属性在使用时可以加{}表示数组,也可以不加表示数组中只有一个元素。

  

三、注解的综合运用:

  注解一般结合反射使用,通过反射模板对象获取注解的类型和属性值。

  注解与反射:

    1、java1.5在反射包中引入了 java.lang.reflect.AnnotatedElement 接口,该接口主要用于注解类型和属性的处理。

    Class、Field、Method类的父类或超类都有实现AnnotatedElement 接口。

      

    该类的子类Field、Method等关于AnnotatedElement 的方法必须被重写

      

    2、AnnotatedElement 接口的基本方法:

      isAnnotationPresent(); 判断该元素上是否存在某个类型的注解。 
      getAnnotation()/getDeclaredAnnotation(); 通过注解类型获取注解对象,从而获取注解的属性值。
      getAnnotations()/getDeclaredAnnotations(); 获取注解集合。

   3、代码片段:
 public static void main(String[] arg) throws NoSuchMethodException, NoSuchFieldException, SecurityException{
Class<UserController> userClass = UserController.class;
// 获取类上的注解
// 判断该对象是否有该注解
if (userClass.isAnnotationPresent(RequestMapping.class)) {
RequestMapping requestMapping = userClass.getDeclaredAnnotation(RequestMapping.class);
String[] value = requestMapping.value();
System.out.println("UserController类上RequestMapping注解的属性:" + Arrays.toString(value));
}else {
System.out.println("UserController类上没有RequestMapping注解!");
} // 获取属性上的注解
Field getField = userClass.getDeclaredField("userService");
SuperBug fSuperBug = getField.getDeclaredAnnotation(SuperBug.class);
String[] fValue = fSuperBug.value();
System.out.println("userService属性上SuperBug注解的值:" + Arrays.toString(fValue)); // 获取方法上的注解
Method getMethod = userClass.getDeclaredMethod("getUserList1", String.class);
SuperBug mSuperBug = getMethod.getDeclaredAnnotation(SuperBug.class);
String[] mValue = mSuperBug.value();
System.out.println("getUserList1方法上SuperBug注解的值:" + Arrays.toString(mValue)); // 获取方法上的所有注解反射模板class
// getDeclaredAnnotations返回该元素上直接声明的注释(不包括继承)
Annotation[] annotations = getMethod.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
Class<? extends Annotation> aClass = annotation.annotationType();
if ("com.superbug.word.annotation.SuperBug".equals(aClass.getTypeName())) {
SuperBug superBug1 = (SuperBug) annotation;
System.out.println(superBug1.toString());
}
}
}

java注解编程@since 1.8的更多相关文章

  1. 初学java注解编程 记录错误及解决办法

    1 :在form表单提交到controller层时 利用hbim的封装的访问数据库 form表单中属性要加上method方法 不然不成功. 2 :在运行eclipse时 有时粘贴个数据或者删除个字段老 ...

  2. java注解编程

  3. Java并发编程中的相关注解

    引自:http://www.cnblogs.com/phoebus0501/archive/2011/02/21/1960077.html Java并发编程中,用到了一些专门为并发编程准备的 Anno ...

  4. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  5. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  6. 框架基础——全面解析Java注解

    为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ...

  7. Java注解实践

    Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...

  8. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  9. java注解(基础)

    一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ...

随机推荐

  1. 固定导航栏(jquery)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. ElasticSearch 7.x 默认不在支持指定索引类型

    原文:ElasticSearch 7.x 默认不在支持指定索引类型 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://bl ...

  3. timeout使用实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 省流量 转:http://www.wtoutiao.com/p/T3b8it.html

    前言:“客户端上传时间戳”的玩法,你玩过么?一起聊聊时间戳的奇技淫巧! 缘起:无线时代,流量敏感.APP在登录后,往往要向服务器同步非常多的数据,很费流量,技术上有没有节省流量的方法呢?这是本文要讨论 ...

  5. mysql的sql语句优化方法面试题总结

    mysql的sql语句优化方法面试题总结 不要写一些没有意义的查询,如需要生成一个空表结构: select col1,col2 into #t from t where 1=0 这类代码不会返回任何结 ...

  6. Linux基于Hadoop2.8.0集群安装配置Hive2.1.1及基础操作

    前言 安装Apache Hive前提是要先安装hadoop集群,并且hive只需要在hadoop的namenode节点集群里安装即可,安装前需保证Hadoop已启(动文中用到了hadoop的hdfs命 ...

  7. wc 统计文件的行数

    1.命令功能 wc 统计文件的行数,单词和字节数 2.语法格式 wc  option  file wc  option  --files0-from=F 参数说明 参数 参数说明 -c 统计字节数 - ...

  8. stream benchmark 交叉编译 on psoc

    之前有研究过这个,居然忘记了,看来确实是老了,没有盘过来. 如何下载,见 linux下载网页上的文件夹以及删除文件(stream) 出现了好几个问题 1. error while loading sh ...

  9. php session之redis存储

    前提:redis已安装好. php代码: <?php ini_set("session.save_handler", "redis"); ini_set( ...

  10. man LVCREATE

    LVCREATE(8)                                                        LVCREATE(8) NAME/名称       lvcreat ...