一、前言                            

注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作。

二、自定义注解                         

只需通过 关键字@interface 即可自定义注解

// 标识注解(就是无属性的注解)
public @interface AnnotationWithoutProperty{
}// 带value属性的注解
public @interface AnnotationWithVal{String value();
}// 带myVal属性的注解
public @interface AnnotationWithMyVal{String[] myValue();
}// 带value和myVal属性的注解
public @interface AnnotationWith2Val{String value();String[] myValue();
}// 带缺省值的myVal属性的注解
public @interface AnnotationWithDefaultVal{String myVal() default "hello world!";
}

使用方式如下:

@AnnotationWithoutProperty
@AnnotationWithVal("hello world") // value属性赋值时,不用显式写出属性名
@AnnotationWithMyVal(myValue={"hello", "world"}) // 其他属性赋值时,必须显示写出属性名
@AnnotationWith2Val(value="hello world", myVal={"hello", "world"})
@AnnotationWithDefaultVal // 属性拥有缺省值时,不必显示设置属性值
@AnnotationWithDefaultVal("new value")
public void test(){}

三、注解的注解                              

注解的注解就是为注解本身提供额外的信息,从而约束或增强注解的能力。其中包含有 @Documented 、 @Inherited 、 @Target 、 Retention 4种注解。

   @Target注解 :用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败。


// 约束@MyAnnotation的作用范围是函数和构造函数
@Target(ElementType.METHOD, ElementType.CONSTRUCTOR)
public @interface MyAnnotation{}

   @Retention注解 :用于约束被描述的注解的作用范围,注解的作用范围有三个,分别为

1.  RetentionPolicy.SOURCE ,作用范围为源码,就是仅存在于java文件中,当执行 javac 命令时将会去除该注解。

2.  RetentionPolicy.CLASS ,作用范围为二进制码,就是存在于class文件中,当执行 java 命令时会去除该注解。

3.  RetentionPolicy.RUNTIME ,作用范围为运行时,就是我们可以通过反射动态获取该注解。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{}

 @Documented注解 :用于指定javadoc生成API文档时显示该注解信息

 @Inherited注解 :用于指定被描述的注解可以被其所描述的类的子类继承。默认情况

// 默认注解不会被子类继承
@MyAnnotation
public class Parent{}// Son并没有继承注解MyAnnotation
public class Son extends Parent{}

通过 @Inherited 子类将会继承父类的 @MyAnnoation注解 。

四、读取注解                                  

通过反射我们可以获取类、函数等上的注解信息。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.CLASS)
@Documented
public @interface MyAnnotaion{String value() default "hello world";
}@MyAnnotation
public class Test{public static void main(String[] args){MyAnnotation ma = Test.class.getAnnotation(MyAnnotation.class);System.out.println(ma.value());// 获取自身和从父类继承的注解Annotation[] annotations = Test.class.getAnnotations();// 仅获取自身的注解Annotation[] annotations = Test.class.getDeclaredAnnotations();}
}

Java魔法堂:自定义和解析注解相关推荐

  1. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  2. Java魔法堂:URI、URL(含URL Protocol Handler)和URN

    转载自   Java魔法堂:URI.URL(含URL Protocol Handler)和URN 一.前言 过去一直搞不清什么是URI什么是URL,现在是时候好好弄清楚它们了!本文作为学习笔记,以便日 ...

  3. 【转】Java魔法堂:String.format详解

    Java魔法堂:String.format详解   目录     一.前言     二.重载方法     三.占位符     四.对字符.字符串进行格式化     五.对整数进行格式化     六.对 ...

  4. Java魔法堂:注解用法详解——@SuppressWarnings

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @S ...

  5. Java魔法堂:注解用法详解——@SuppressWarnings(转)

    一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的"感叹号"就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @S ...

  6. Java魔法堂:枚举类型详解

    一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{RED = 0,BLUE = 1 } Console.Writ ...

  7. java魔法堂_Java魔法堂:调用外部程序

    前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不能通 ...

  8. Java魔法堂:深入正则表达式API

    目录 一.前言 二.正则表达式的使用诉求 三.java.util.regex包 四.java.lang.String实例 五.最短路径实现诉求 六.Java支持的正则表达式功能语法 七.总结 八.参考 ...

  9. Java魔法堂:初探MessageFormat.format和ChoiceFormat

    一.前言 刚开始从.net的转向java的时候总觉得 String.format 用得不习惯,希望格式模版会这样 {0}, this is {1}'s cat.{1},this is {0}'s do ...

最新文章

  1. 面试官扎心一问:数据量很大,分页查询很慢,有什么优化方案?
  2. python3.6 3.7共存_[转]CentOS 7安装Python3.6过程(让linux系统共存Python2和Python3环境)...
  3. linux 系统监控、诊断工具之 top 详解
  4. HTTP/3 原理实战
  5. 未越狱设备提取数据_从三星设备中提取健康数据
  6. java gui 连接mysql数据库
  7. IDEA怎么开启终端Terminal
  8. 【Siddhi】Flink Siddhi自定义函数
  9. 搭建微信公共平台的本地测试
  10. Vs 2008 解决方案的目录结构设置和管理
  11. 计算年龄案例(JS)
  12. IDM(Internet Download Manager)下载各类安装包(github代码、python包)、软件、视频、文档的神器,居家必备良药
  13. imagesc和pcolor区别
  14. EDIUS 9 PRO(视频编辑软件)
  15. Next主题添加背景图片
  16. 五分钟学Java:一篇文章带你搞懂spring全家桶套餐
  17. 求最长不下降序列:逆推法
  18. 高职Java竞赛_2019年全国职业院校技能大赛高职组“物联网技术应用”赛项开赛...
  19. 机器学习入门(二) 准备工作
  20. Mysql统计数据库和表大小

热门文章

  1. 从程序员到项目经理(24):慎于问敏于行 - 忠于工作不等于奴性
  2. hashtable的C++实现
  3. RobotStudio传送带设计
  4. 液晶拼接处理器_创新维OLED拼接屏施工单位操作说明
  5. linux 编译c q64,Ubuntu 12.04 LTS 64位搭建Qt4终端编译环境
  6. mysql用来干嘛的_CPU占用又爆了?MySQL到底在干什么
  7. newton版本linux,云计算之openstack-newton版搭建(四)
  8. iOS Swift JSON解析教程
  9. 机器学习 python 库_Python机器学习库
  10. Java String子序列