还望支持个人博客站:http://www.enjoytoday.cn

介绍

Annotation的中文名字叫注解,开始与JDK 1.5,为了增强xml元数据和代码的耦合性的产物。注解本身并没有业务逻辑处理,仅仅是一个声明,具体的处理需要交由使用这些注解的工具类或方法,原则上来说,注解应该是对代码书写的一个辅助,即注解是否存在均不能影响代码的正常运行。现在java中使用注解的场景是越来越多,如orm框架,Ioc框架等,开发人员使用注解的方式可以简化对于元数据的维护和构建(xml配置数据),接下来主要介绍自定义注解的方法和如何使用自定义注解。

自定义注解

和注解相关的java文件的位置在java.lang.annotation包下自定义注解比较简单 格式和一般的java文件类似,声明如下:

@Documented
@Target(ElementType.TYPE)
@Retentiion(RetentionPolicy.RUNTIME)
@Inherited
public @interface annotation{
int value() default -1;
}

如上所示就是一般注解定义的格式,其中在声明注解之前需要定义注解的使用场景等信息,即添加元注解,java提供的元注解有四类,介绍如下:

1)@Documented

     一个简单的问但包含注解,添加即代表注解包含在Javadoc中,我们可以通过javadoc -d doc *.java生成一个java的doc文档。

2)@Target

     声明注解的使用场景,默认为可用于任何场景,参数类型为枚举,包括的属性有如下:

- ElementType.TYPE:在class,interface(包括@interface),enum声明前

- ElementType.FIELD:全局变量前

- ElementType.METHOD:方法前

- ElementType.PARAMETER:方法参数前

- ElementType.CONSTRUCTOR:构造方法前

- ElementType.LOCAL_VARIABLE:方法内部参数前

- ElementType.ANNOTATION_TYPE:@interface前

- ElementType.PACKAGE:用于记录java文件的package信息

**3)@Retention**
     定义该注解的生命周期,参数类型如下:
- RetentionPolicy.SOURCE:编译器要丢弃的注释。

- RetentionPolicy.CLASS: 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。默认为该属性

- RetentionPolicy.RUNTIME:编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

**4)@Inherited**
     该注解表明子类继承该注解,反之不继承。

## 使用
使用分三段介绍:首先给出注解的定义,然后给出注解的使用方式,最后给出注解的逻辑处理方法。

### 自定义一个注解
注解的自定义声明为@interface默认继承Annotation接口,格式如下:

/**
* @date 17-2-8.
* @className ClassTypeModel
* @serial 1.0.0
* @see Target @Target:设置注释引用的类型
* @see ElementType 注释引用类型枚举 ElementType.TYPE:class interface(包括annotation),enum引用
* @see Retention @Retention:注释适用范围
* @see RetentionPolicy 注释使用类型枚举
*/ @Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@AnnotationTypeModel
public @interface TypeModel {
String value() default "TypeModel";
int id() default -7;
boolean isActive() default false;
int value () default -1; }

如上,注解中的方法的返回可以通过 default 设置默认返回值。

注解的引用

注解的使用需要根据注解已经声明的使用场景中使用,否则会包类型不匹配错误,使用如下:

@TypeModel(id = 7, isActive = true,value = "MyClass")

public class MyClass {

    @ConstructorTypeModel(id = 1000,isActive = true,value = "MyClass")
public MyClass(){
System.out.print("this is MyClass ConstructorTypeModel\n");
annotatioinTestMethod(true);
} @FieldTypeModel(id = 10,isActive = true,value = "type")
private String type;
@FieldTypeModel(id = 11,isActive = true,value = "name")
private String name;
@FieldTypeModel(id = 10,isActive = true,value = "favorite")
private String favorite; @MethodTypeModel(id = 5,isActive = true,value = "annotatioinTestMethod")
private void annotatioinTestMethod(@ParamTypeModel(id = 6,isActive = true,value = "testparam") boolean isTest){
@LocalVarTypeModel(isActive = true)
boolean flag=isTest;
System.out.print("this is annotationTestMethod.\n"); }
......
}

注解的处理

注解在使用后我们可以通过java反射的原理获取到注解的值,方便从而方便我们之后的业务逻辑处理,处理如下:

/**
* 通过反射获取注入的内容
*/
private static void reflectAnnotations(){
MyClass myClass=new MyClass();
// //only jdk over 1.8
// MyClass myClass1=new @UseTypeModel(isActive = true) MyClass();
Class<?> tClass=myClass.getClass();
Annotation[] annotations= tClass.getDeclaredAnnotations();
annotationPrint(annotations,"classAnnotations");
Constructor<?>[] constructors= tClass.getDeclaredConstructors();
System.err.println("Constructor of all.\n");
for (Constructor<?> constructor:constructors){
Annotation[] constructorDeclaredAnnotations= constructor.getDeclaredAnnotations();
annotationPrint(constructorDeclaredAnnotations,"constructorDeclaredAnnotations");
} System.err.println("Methods of all.\n");
Method[] methods=tClass.getDeclaredMethods();
for (Method method:methods){
Annotation[] methodAnnotation=method.getDeclaredAnnotations(); annotationPrint(methodAnnotation,"methodAnnotation"); Annotation[][] paramAnnotations= method.getParameterAnnotations();
for (Annotation[] annotation: paramAnnotations){
annotationPrint(annotation,"paramAnnotations");
} }
System.err.println("Field of all.\n");
Field[] fields=tClass.getDeclaredFields(); for (Field field:fields){
Annotation[] filedAnnotations= field.getDeclaredAnnotations();
annotationPrint(filedAnnotations,"filedAnnotations");
} } private static void annotationPrint(Annotation[] annotations,String type){
for (Annotation annotation: annotations){
System.out.println(type+" toString:"+annotation.toString()+"\n");
Class<?> clazz= annotation.annotationType();
System.out.println("annotation class name:"+clazz.getName());
Annotation[] declaredAnnotations= clazz.getDeclaredAnnotations();
//注释的注释
for (Annotation annotation1:declaredAnnotations){
System.out.println(annotation.getClass().getSimpleName()+" annotation toString:"+annotation1.toString()+"\n");
}
}
}

如上就是一个简单的注解demo介绍.

源码

源码下载地址:annotationdemojava

java annotation使用介绍的更多相关文章

  1. Java Annotation认知(包括框架图、详细介绍、示例说明)

    摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...

  2. Java Annotation认知(包括框架图、详细介绍、示例说明)(转)

    本文转自:http://www.cnblogs.com/skywang12345/p/3344137.html 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annota ...

  3. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  4. Java Annotation原理分析(一)

    转自:http://blog.csdn.net/blueheart20/article/details/18725801 小引: 在当下的Java语言层面上,Annotation已经被应用到了语言的各 ...

  5. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  6. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  7. Java Annotation手册

    Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...

  8. 【转】Spring学习---Bean配置的三种方式(XML、注解、Java类)介绍与对比

    [原文]https://www.toutiao.com/i6594205115605844493/ Spring学习Bean配置的三种方式(XML.注解.Java类)介绍与对比 本文将详细介绍Spri ...

  9. 1.2.4 Java Annotation 提要

    (本文是介绍依赖注入容器Spring和分析JUnit源码的准备知识) Java Annotation(标注) java.lang.annotation.Annotation是全部Java标注的父接口. ...

随机推荐

  1. vue之虚拟DOM、diff算法

    一.真实DOM和其解析流程? 浏览器渲染引擎工作流程都差不多,大致分为5步,创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting 第一步,用HTM ...

  2. 简单学习HTML

    最近突然就对静态页面很有兴趣,主要是看到几个比较酷炫的页面效果,也想自己做一下,但是我的前端页面就是菜鸡,还停留在html+css+jquery的简单使用上,而且还忘记得差不多了! 而且我感觉前端比后 ...

  3. 这些Android系统样式中的颜色属性你知道吗?

    Android 系统样式中的颜色属性 推荐阅读看完后彻底搞清楚Android中的 Attr . Style .Theme 几个常用的颜色属性 先放上一张经典的图片,图片来自网络. 这张图在网上很是流传 ...

  4. c语言内存

    冯诺依曼结构是:数据和代码放在一起. 哈佛结构是:数据和代码分开存在.内存管理fiLO 先进后出 栈FIFO 先进先出 队列栈的特点是入口即出口,另一个口是堵死的,所以先进去的后出来队列的特点是入口和 ...

  5. Notification 弹出一个通知在桌面右下角

    if (!("Notification" in window)) { //alert("This browser does not support desktop not ...

  6. LG5202 「USACO2019JAN」Redistricting 动态规划+堆/单调队列优化

    问题描述 LG5202 题解 \[opt[i]=xx+(cnt[i]-cnt[yy]<=0)\] 发现\(cnt[i]-cnt[yy] <= 0\)只能有两种取值 于是直接堆优化即可 \( ...

  7. Codeforces Round #594 (Div. 1)

    Preface 这场CF真是细节多的爆炸,B,C,F都是大细节题,每道题都写了好久的说 CSP前的打的最后一场比赛了吧,瞬间凉意满满 希望CSP可以狗住冬令营啊(再狗不住真没了) A. Ivan th ...

  8. C# params 可变参数使用注意

    今天在一个 .NET Core 项目中调用一个自己实现的使用 params 可变参数的方法时触发了 null 引用异常,原以为是方法中没有对参数进行 null 值检查引起的,于是加上 check nu ...

  9. 定时锁屏程序,Python祝你原理猝死!

    高以翔事件 11月27日在<追我吧>第九期节目的录制过程中,当期参与嘉宾高以翔奔跑时突然减速倒地,节目现场医护人员第一时间展开救治,并紧急将其送往医院.经过两个多小时的全力抢救,医院最终宣 ...

  10. 【STM32H7教程】第16章 STM32H7必备的HAL库API(重要)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第16章       STM32H7必备的HAL库API(重要 ...