一、基本元注解:    

  @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. 第一个progressive web application,发车!

    progressive web application是谷歌推出的一种渐进式web应用,通过利用service-worker等来达到类似于原生应用,而且在chrome浏览器还可以添加到主页,完全就和一 ...

  2. Redis的客户端Jedis

    1. Redis支持消息的订阅与发布 Redis的消息订阅支持:先订阅后发布 订阅:subscribe c1 c2 发布:publish c2 hello-redis 支持通配符的订阅:psubscr ...

  3. 微信支付签名算法JavaScript版,参数名ASCII码从小到大排序;0,A,B,a,b;

    // 支付md5加密获取sign paysignjs: function (jsonobj) { var signstr = this.obj2str(jsonobj) signstr = signs ...

  4. JavaScript版EAN码校验算法

      <script type="text/javascript"> $(document).ready(function () { $("#btnCalc&q ...

  5. Android Studio使用阿里云Aliyun Maven仓库

    如下所示,在build.gradle中添加Aliyun Maven仓库 // Top-level build file where you can add configuration options ...

  6. 装饰器模式-Decerator

    一.定义 装饰器模式又叫做包装模式(Wrapper).装饰器模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 在以下情况下应该使用装饰器模式: 1.需要扩展一个类的功能,或给一个类增 ...

  7. RMQ Direct

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11792398.html RMQ Direct Project Directory Maven Depe ...

  8. [POJ 1911] 棋盘

    问题描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着 ...

  9. 对webpack的初步研究7

    Configuration 您可能已经注意到很少有webpack配置看起来完全相同.这是因为webpack的配置文件是导出对象的JavaScript文件.然后,webpack根据其定义的属性处理此对象 ...

  10. MainRun

    package Testlink; import java.io.IOException; public class MainRun { public static void main(String[ ...