`
lbfhappy
  • 浏览: 81941 次
社区版块
存档分类
最新评论

学习小记

阅读更多

今天了解一下JAVA元数据的用法和一些作用,拿出一些例子,给自己看,怕自己以后忘了

JAVA的元数据功能是JDK1.5才开始支持的,以前都没有,正因为是新支持的,所以有关于它的介绍挺少,用处也不太多,最近发现很多框架都可以把它用来配置一些东西,以代替以前比较复杂的XML配置.想像一下,在JAVA代码中直接写入注释来配置,那该是多么好的事情,让我们写习惯了代码和看习惯了代码的人来说,这无疑是一件很爽的事情.

我们可以使用JAVA内置的注释内型,如果觉得不够用,可以定义自己的注释内型,定义如下

java 代码
  1. /*  
  2.  * MyType.java  
  3.  *  
  4.  * Created on 2006年12月7日, 下午3:40  
  5.  *  
  6.  * To change this template, choose Tools | Template Manager  
  7.  * and open the template in the editor.  
  8.  */  
  9.   
  10. package testAnno;   
  11.   
  12. /**  
  13.  *  
  14.  * @author lbf  
  15.  */  
  16. import java.lang.annotation.*;   
  17. @Retention(RetentionPolicy.RUNTIME)   
  18. @Target({ElementType.TYPE,ElementType.METHOD})   
  19. public @interface MyType {   
  20.     String authorName();   
  21.     String lastModified();   
  22.     String bugFixes() default "ok";   
  23. }   

这里我定义了一个我自己的注释类,声明方式和声明接口差不多,只不过在interface前面多了一个@符号. 

注释类也可以用注释类注释,如此下去.

@Retention(RetentionPolicy.RUNTIME)

这句表示它的保存范围是到RUNTIME,也就是运行时,这样在类运行的时候,我们也可以取到有关它的信息.

@Target({ElementType.TYPE,ElementType.METHOD})  

这句表示它的适用对象,它可以用在哪里地方,我这里定义的是它可以用在类的定义和方法的定义上

然后我们看我们是怎么为我们写的类加上注释的

java 代码
  1. /*  
  2.  * Test1.java  
  3.  *  
  4.  * Created on 2006年12月7日, 下午3:34  
  5.  *  
  6.  * To change this template, choose Tools | Template Manager  
  7.  * and open the template in the editor.  
  8.  */  
  9.   
  10. package testAnno;   
  11.   
  12. /**  
  13.  *  
  14.  * @author lbf  
  15.  */  
  16. import java.lang.annotation.*;   
  17. @MyType(authorName="hadeslee",lastModified="20061207")   
  18. public class Test1 {   
  19.        
  20.     /** Creates a new instance of Test1 */  
  21.     public Test1() {   
  22.     }   
  23.     @Deprecated  
  24.     @MyType(authorName="hadeslee",lastModified="20061207",bugFixes="what")   
  25.     public void doSth(){   
  26.               
  27.     }   
  28.     @MyType(authorName="hadeslee",lastModified="20061207",bugFixes="what")   
  29.     public void doAnother(){   
  30.            
  31.     }   
  32. }   

加了元数据的类和不加元数据的类差不多,只不过如果你的元数据注释如果是运行时的话,你的类文件可能会双不加元数据大一些,因为它必须把一些注释的信息写入到class文件中去,我们已经注释了我们的类,现在我们来看一下,我们如何去取我们的注释,

java 代码
  1. /*  
  2.  * GetAnno.java  
  3.  *  
  4.  * Created on 2006年12月7日, 下午3:46  
  5.  *  
  6.  * To change this template, choose Tools | Template Manager  
  7.  * and open the template in the editor.  
  8.  */  
  9.   
  10. package testAnno;   
  11.   
  12. /**  
  13.  *  
  14.  * @author lbf  
  15.  */  
  16. import java.lang.annotation.*;   
  17. import java.lang.reflect.*;   
  18. public class GetAnno {   
  19.        
  20.     /** Creates a new instance of GetAnno */  
  21.     public GetAnno() {   
  22.     }   
  23.     public static void main(String[] args)throws Exception {   
  24.         Test1 t=new Test1();   
  25.         Class c=Test1.class ;   
  26.         Annotation[] as= c.getDeclaredAnnotations();   
  27.         for(Annotation an:as){   
  28.             System.out.println("类Test1的注释"+an);   
  29.         }   
  30.         Method med=c.getDeclaredMethod("doSth");   
  31.         Annotation[] ass=med.getDeclaredAnnotations();   
  32.         for(Annotation an:ass){   
  33.             Class<!---->extends Annotation> clazz=an.annotationType();   
  34.             Annotation[] ased=clazz.getAnnotations();   
  35.             for(Annotation ad:ased){   
  36.                 System.out.println("注释的注释:"+ad);   
  37.             }   
  38.             System.out.println("方法doSth的注释:"+an);   
  39.         }   
  40.     }   
  41. }   

 此程序输出如下

类Test1的注释@testAnno.MyType(bugFixes=ok, authorName=hadeslee, lastModified=20061207)
注释的注释:@java.lang.annotation.Documented()
注释的注释:@java.lang.annotation.Retention(value=RUNTIME)
方法doSth的注释:@java.lang.Deprecated()
注释的注释:@java.lang.annotation.Retention(value=RUNTIME)
注释的注释:@java.lang.annotation.Target(value=[TYPE, METHOD])
方法doSth的注释:@testAnno.MyType(bugFixes=what, authorName=hadeslee, lastModified=20061207)

 

 

简单的写了一点点关元数据的东西,希望对自己或者对别人有一点点帮助.

 

千里冰封于2006年12月7日下午

从这代码里,我们可以看出,取注释其实很简单,就是利用反射机制来取的.不过我们要特别注意到的一点是,我们不但可以取我们定义的类的注释,也可以取注释的注释,我们这里只取到了MyType的注释,其实还可以往下取,在取的过程中,我们可以看到这些元数据注释类都用了哪些注释:)
分享到:
评论

相关推荐

    GeoStudio学习小记.pdf

    GeoStudio学习小记

    redis安全学习小记1

    redis安全学习小记1

    104规约规约学习小记

    104规约学习,电力系统104规约学习小记,包括固定长度报文,常见帧,报文示例,总召唤命令

    d3js 学习小记

    d3js 的一点点学习心得, 希望能有用.

    LocalCache 学习小记1

    第三种:调shard.go中的del ,同理,也是软删除 第四种:定时删除,此删除式是硬删除 第五种:这种删除式般不会被调,故放在最后,是硬删除

    单元测试学习小记

    单元测试学习小记软件测试什么是单元测试单元在程序里可以简单的理解为一个模块,一个方法。单元测试也就是在完成每个模块后都进行的测试。从确保每个模块没有问题,从而提高整体的程序质量。做单元测试的好处对于...

    百度paddle课程学习小记(上)

    百度paddle课程学习小记(上)百度paddle课程学习小记(上)Day-1:python基础练习Day-2:《青春有你2》选手信息爬取遇到的问题Day-3《青春有你2》选手数据分析遇到的问题未完待续 百度paddle课程学习小记(上) 第...

    js 正则学习小记之匹配字符串字面量优化篇

    昨天在《js 正则学习小记之匹配字符串字面量》谈到 /”(?:\\.|[^”])*”/ 是个不错的表达式,因为可以满足我们的要求,所以这个表达式可用,但不一定是最好的。 从性能上来说,他非常糟糕,为什么这么说呢,因为 ...

    VC学习小记

    Windows消息机制 Visual C++/MFC开发 MFC中常用类,宏,函数 和GUI有关的各种对象 在窗口中输出文字 使用点,刷子,笔进行绘图 在窗口中绘制设备相关位图,图标,设备无关位图 使用各种映射方式 ...

    CAPWAP学习小记

    小弟工作中接触无线网络,就学习了CAPWAP技术,然后小小总结一下.....

    SQL学习小记

    NULL 博文链接:https://alex-cheung.iteye.com/blog/1819011

    js正则学习小记之匹配字符串字面量

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享。 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配。(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) ...

    flex与PHP数据交互教程

    flex与PHP后台数据交互的学习小记,Flex与后台交互的方法

    浅谈js正则字面量//与new RegExp的执行效率

    前几天谈了正则匹配 js 字符串的问题:《js 正则学习小记之匹配字符串》 和 《js 正则学习小记之匹配字符串优化篇》。 里面讲到了优化正则起到提升性能的问题,但是能提升多少呢? 于是我去测试了,发现TMD几乎...

    vue-cli设置publicPath小记

    主要介绍了vue-cli设置publicPath小记,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    数据结构 代码集 拾荒小记

    自己写的一本数据结构程序集,电子书chm版,实现了严蔚敏版的数据结构中80%以上的算法,书中100% 的代码都是由个人编写. 是本人学习编程,学习数据结构的一个总结. 取名为拾荒小记 亦为总结,亦为追忆

Global site tag (gtag.js) - Google Analytics