注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载)Java魔法堂:自定义和解析注解  

2014-12-09 11:15:43|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.cnblogs.com/fsjohnhuang/p/4040929.html

Java魔法堂:自定义和解析注解

 

一、前言                            

 

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

 

 

 

二、自定义注解                         

 

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

 

复制代码

// 标识注解(就是无属性的注解)

public @interface AnnotationWithoutProperty{

}

 

// value属性的注解

public @interface AnnotationWithVal{

  String value();

}

 

// myVal属性的注解

public @interface AnnotationWithMyVal{

  String[] myValue();

}

 

// valuemyVal属性的注解

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

 

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

  评论这张
 
阅读(401)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017