Java魔法堂:自定义和解析注解
一、前言
注解(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();
}
}
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4040929.html ^_^肥仔John
五、参考
http://www.cnblogs.com/liubiqu/archive/2008/06/01/1211503.html
Java魔法堂:自定义和解析注解的更多相关文章
- Java魔法堂:类加载器入了个门
一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日 ...
- Java魔法堂:打包知识点之jar
一.前言 通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧! 二.JAR包 JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件, ...
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- Java魔法堂:注解用法详解——@SuppressWarnings
一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...
- Java魔法堂:注解用法详解——@SuppressWarnings(转)
一.前言 编码时我们总会发现如下变量未被使用的警告提示: 上述代码编译通过且可以运行,但每行前面的“感叹号”就严重阻碍了我们判断该行是否设置的断点了.这时我们可以在方法前添加 @SuppressWar ...
- Java魔法堂:注解用法详解——@Override
一.前言 现在有Son和Parent两个类,且类型Son将会重写类型Parent的getName函数.但不幸的是由于码农大意,写成如下代码: public class Parent{ public S ...
- Java魔法堂:Date与日期时间格式化
一.前言 日期时间的获取.显 ...
- Java魔法堂:枚举类型详解
一.前言 Java的枚举类型相对C#来说具有更灵活可配置性,Java的枚举类型可以携带更多的信息. // C# enum MyColor{ RED = , BLUE = } Console.Write ...
- Java魔法堂:类加载机制入了个门
一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM ...
随机推荐
- jxl 2.6.12 与 jxl 2.3.0 稳定版性能比较
jxl 2.3.0 org.jxls:jxls:2.3.0 org.jxls:jxls-poi:1.0.9 org.jxls:jxls-jexcel:1.0.6 jxls-reader:2.0.2 j ...
- Mysql:Error Code 1235,This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决 这次国庆节回来后的测试中,在一个Mysql表达式 ...
- 简单好用的sshfs -- 通过ssh映射远程路径(转)
最近习惯性访问N个Linux机器,在不同机器间跳来跳去,很是麻烦,最终,找到了sshfs,可以把远程目录直接映射到本地,无需修改远程机器的设置,仅要求有ssh连接的权限(ssh都没有的话,还能干啥?! ...
- Ubuntu server下搭建Maven私服Nexus
Ubuntu server下搭建Maven私服Nexus Maven私服Nexus的作用,主要是为了节省资源,在内部作为maven开发资源共享服务器来使用. 1.下载 通过root用户进去Ubuntu ...
- 【转帖】自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势
自助式BI的崛起:三张图看清商业智能和大数据分析市场趋势 大数据时代,商业智能和数据分析软件市场正在经历一场巨变,那些强调易用性的,人人都能使用的分析软件正在取代传统复杂的商业智能和分析软件成为市场的 ...
- [亿能测试_www.gdtesting.com]测试技术资料网盘共享
[亿能测试_www.gdtesting.com]测试技术资料网盘共享: http://pan.baidu.com/share/home?uk=974090852
- ASP.NET MVC 的自定义模型属性别名绑定
最近在研究 ASP.NET MVC 模型绑定,发现 DefaultModelBinder 有一个弊端,就是无法实现对浏览器请求参数的自定义,最初的想法是想为实体模型的属性设置特性(Attribute) ...
- 数据人员Sql必会——行转列
今天被问到列转行的问题,竟然没有回答上来,回想自己也是数据开发人员,平时的积累真是不到位,下面总结一下列转行. 假设咱们有一个学生得分数据表:student_score CREATE TABLE st ...
- asp.net首页设置
在web.config中设置首页 <configuration> <system.web> <compilation debug="true" tar ...
- Oracle数据库入门——物化视图日志结构
物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...