什么是注解?

#======================================================================================================================
Annotation(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来获取注解里面的元数据。  Annotation可以用于创建文档,跟踪代码中的依赖性,执行编译时的检查。Annotation就像修饰符一样被使用,可用于包,类型,构造方法,方法,成员变量,
 参数,本地变量的申明中。这些信息会被存储在Annotation的“name=value”结构对中。
#======================================================================================================================

什么是metadata元数据?

#==========================================================================================================================
元数据,即“描述数据的数据”的意思,元数据一词从“metadata”翻译过来。
 
 Annotation的行为非常类似于public,final这样的修饰符。  Annotation类型定义了Annotation的名字,类型,成员默认值,一个Annotation可以说是一个特殊的Java接口,它的成员变量是受限制的,当我们通过Java反射
 API访问注解的时候,返回值将是一个实现了该Annotation类型接口的对象,通过这个对象我们能方便的访问到其他的Annotation成员。            
#============================================================================================================================

注解的分类?

#==========================================================================================================================

 JDK内置系统的注解:@Override,@Deprecated
 元注解:@Target,@Retention,@Document,@Inhrited,

 自定义注解:(元注解的作用就是负责注解其他注解)

#==========================================================================================================================

注解是如何使用?

#==========================================================================================================================

 // 用于描述注解的使用范围
 @Target(ElementType.Constructor)
 @Target(ElementType.Field)
 @Target(ElementType.Local_Variable)
 @Target(ElementType.Method)
 @Target(ElementType.Package)
 @Target(ElementType.Paramater)
 @Target(ElementType.Type) // 用于描述注解的生命周期
 @Rentention(RetentionPolicy.source)
 @Rentention(RetentionPolicy.class)
 @Rentention(RetentionPolicy.runtime)
 
 @Document 和 @Inhrited 不常用,暂时不做介绍; #==========================================================================================================================

自定义注解(注解与反射机制)

#==========================================================================================================================

 @Target(ElementType.Parameter)
 @Retention(RetentionPolicy.Runtime) 
 public @interface CacheKey{
    String value();
 }
 比如我们在代码中定义上述注解,直观的我们能看到注解使用在参数上,使用周期是运用在运行时使用,注解的参数名是value。阐述自定义注解:
 1. 使用@interface自定义注解的时候,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
 2. 自定义注解,不能继承其他的注解或者接口。
 3. @interface用来申明一个注解,其中的每一个方法实际上是申明了一个配置参数,方法的名称就是参数的名称。
 4. 返回值类型仅仅包括:基本数据类型 + class + Enum + String
 5. 参数只能用public或default修饰,如果只有一个参数,最好把参数名称设置为value()。  注解元素的默认值:注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此,
 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,
 并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
#==========================================================================================================================

关于注解的一些其他说明

#==========================================================================================================================

public interface Annotation{

  boolean equals(Object obj);
  int hasCode();
  String toString();
  Class<? extends Annotation> annotationType();
}
Java中的注解是一种继承自接口的java.lang.annotation.Annotation的接口。
#==========================================================================================================================

注解在程序运行时是如何作处理的

  java在java.lang.reflect下新增了AnnotatedElement接口,java处理注解的原理如下:

@Getter
@Setter
public class Person{ @Name("狂刀")
private String name; @Gender(gender=Gender.GenderType)
private String gender; @Profile(id=1001, height=180, nativePlace="CN")
private String profile;
} public class CustomUtils{ public static void getInfo(Class<?> clazz){ Sring name; String gender; String profile;
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
  if(field.isAnnotationPresent(Name.class)){
        Name arg0 = field.getAnnotation(Name.class);
          name = name + arg0.value();
     }
  if(field.isAnnotationPresent(Gender.class)){
         Gender arg0 = field.getAnnotation(Gender.class);
         gender = gender + arg0.gender().toString();     
      }
       if(field.isAnnotationPresent(Profile.class)){
         Profile arg0 = field.getAnnotation(Profile.class);
         profile = profile + "id = " + arg0.id + ", height = " + arg0.height + ",nativePlace = " + arg0.nativePlace;
       }
}
}
}

自定义注解 && Spring AOP的使用

#==========================================================================================================================

       通常使用场景:自定义注解 ==》Spring AOP中获取注解,并处理

@Around("publicMethods() && @annotation(timedAnnotation)")
public Object instrumentTimed(ProceedingJoinPoint pjp, TimingTimed timedAnnotation) throws Throwable {
  String name = name(pjp.getTarget().getClass(), StringUtils.hasLength(timedAnnotation.name())

                      ? timedAnnotation.name() : pjp.getSignature().getName(), "timingTimer");
  Metric metric = registry.getMetric(name);
  if (metric == null) {
    RedAlertMetric redAlertMetric = new RedAlertMetric(new TimingTimer(), name,
                  timedAnnotation.measurement(), timedAnnotation.interval());
    metric = registry.register(name, redAlertMetric);
  }
  if (metric != null && metric instanceof RedAlertMetric) {
      Metric timer = ((RedAlertMetric) metric).getMetric();
    if (timer != null && timer instanceof TimingTimer) {
      TimingTimer.Context tc = ((TimingTimer) timer).time();
      try {
        return pjp.proceed();
      } finally {
        tc.stop();
      }
    } else {
      return pjp.proceed();
    }
  } else {
  return pjp.proceed();
  }
}


#==========================================================================================================================

附,参考文章:

[1] http://blog.csdn.net/u013045971/article/details/53433874 

[2] 自定义注解的使用Demo

Java自定义注解的使用的更多相关文章

  1. java自定义注解类

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

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

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

  3. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  4. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  5. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

  6. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  7. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  8. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  9. JAVA自定义注解

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

  10. Java 自定义注解

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

随机推荐

  1. sql语句1——join

    注:一下内容来自于http://www.w3school.com.cn/sql/ 1. 引用两个表 我们可以通过引用两个表的方式,从两个表中获取数据: 谁订购了产品,并且他们订购了什么产品? sele ...

  2. Java代码优化小结(二)

    (21)将常量声明为static final,并以大写命名 这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值.另外,将常量的名字以大写命名也可以方便区分出常量与变量 (22)不 ...

  3. LeetCode(169. 求众数)

    问题描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

  4. 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)

    项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...

  5. [ZOJ2069]Greatest Least Common Multiple

    [ZOJ2069]Greatest Least Common Multiple 题目大意: 给定一个正整数\(n\),将其分成若干个正整数之和,最大化这些数的LCM.保证答案小于\(10^{25}\) ...

  6. [模板][P3803]多项式乘法

    Description: FFT真的容易忘,所以就放到上面来了 #include<bits/stdc++.h> using namespace std; const int mxn=4e6 ...

  7. Html块标签、含样式的标签、语义化的标签:

    Html块标签: (1)<div>标签 块元素,表示一块内容,没有具体的语义 (2)<span>标签 行内元素,表示一行中的一小段内容,没有具体的语义 <p>标签 ...

  8. Python 调用图像融合API

    Python 调用图像融合API 本文记录使用Python,调用腾讯AI开放平台的图像融合API.官网给出的Demo用的是PHP,博主作为Python的粉丝,自然想用它来和『最好的』的语言一较高下,顺 ...

  9. 11-14 dom

    1.DOM document object model (1) 节点树状图:Document>documentElement>body>tagname 2.我们常用的节点类型 元素节 ...

  10. MySQL创建用户的三种方法 (并授权)转

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...