一、前言                            

注解(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魔法堂:自定义和解析注解的更多相关文章

  1. Java魔法堂:类加载器入了个门

    一.前言 <Java魔法堂:类加载机制入了个门>中提及整个类加载流程中只有加载阶段作为码农的我们可以入手干预,其余均由JVM处理.本文将记录加载阶段的核心组件——类加载器的相关信息,以便日 ...

  2. Java魔法堂:打包知识点之jar

    一.前言    通过eclipse导出jar包十分方便快捷,但作为码农岂能满足GUI的便捷呢?所以一起来CLI吧! 二.JAR包 JAR包是基于ZIP文件格式,用于将多个.java文件和各种资源文件, ...

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

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

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

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

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

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

  6. Java魔法堂:注解用法详解——@Override

    一.前言 现在有Son和Parent两个类,且类型Son将会重写类型Parent的getName函数.但不幸的是由于码农大意,写成如下代码: public class Parent{ public S ...

  7. Java魔法堂:Date与日期时间格式化

    一.前言                                                                                       日期时间的获取.显 ...

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

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

  9. Java魔法堂:类加载机制入了个门

    一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM ...

随机推荐

  1. 解决VS2010中在项目上右键鼠标,无“添加STS引用”菜单的问题

    解决方法:将Windows Identity Foundation SDK文件夹C:\Program Files (x86)\Windows Identity Foundation SDK\v3.5\ ...

  2. ubuntu 16.04 samba 文件共享

    生成samba用户名密码修改配置文件重启samba服务使之生效 以前在ubuntu 14.04的时候,很方便的通过几行命令和一个GUI界面就可以配置好samba共享文件给windows了: Ubunt ...

  3. [Aaronyang] 写给自己的WPF4.5 笔记20 [3d课 1/4]

    假设你是高中毕业的,ok,数学知识几何知识中,我们学过  x,y,z   3个轴然后就可以画出形状了. 1. 新建空白窗体,grid换成canvas,然后新增一个Viewport3D元素 3d中显示的 ...

  4. 七牛CEO许式伟:移动游戏资源存贮的大趋势

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 9月14日,eoe移动开发者大会正式在北京国家会议中心召开,七牛云储存CEO许式伟先生做了 ...

  5. ubuntu 休眠之后网络间接失败 can not connect to network after suspend (wake up)

    ubuntu for laptop系统在系统休眠后wakeup 之后,网络连接失败, 有线网络无法连接, 无线wifi无法连接, 只能重启后才能恢复, 此时可以采用以下方法处理: 1. 在/etc/p ...

  6. Navi.Soft30.产品.阅读导航

    Navi.Soft30.Core类库.开发手册 Navi.Soft30.框架.WinForm开发手册 Navi.Soft30.框架.WebMVC开发手册 Navi.Soft30.框架.Mobile.开 ...

  7. MYSQL校对规则

    一.前言 有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录:有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新 ...

  8. CSS基础(五):定位

    CSS定位机制 CSS 有三种基本的定位机制:相对定位.浮动和绝对定位. 相对定位 相对定位指的是设置为相对定位的元素框会偏移某个距离.元素仍然保持其未定位前的形状,它原本所占的空间仍保留. 如果将b ...

  9. 在CodedUI中使用JQuery选择器

    在CodedUI中使用JQuery选择器http://automationqa.com/forum.php?mod=viewthread&tid=3574&fromuid=29

  10. Python基本语句

    x = 1 y = 1 dataf = 1.0 def fun1(): print("fun1") class ClassB(): def __init__(self): prin ...