Annotation是Java5、6只后的新特征(中文称之为注解),并且越来越多的得到了应用,比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用,通过使用注解,代码的灵活性大大提高。这些都是使用别人定义的注解,一般注解的使用都是在一些基础框架或者类库中来定义的,因此很少见过有人自己去写一个注解出来并使用在程序中,因此注解的使用常常给人感觉很神秘,这就为你揭开注解的面纱。
注解的神秘之处在于:通过类似注释的方式,可以控制程序的一些行为,运行时的状态,可以为成员赋值,做配置信息等等,与常规编码思维大相径庭。只用别人定义好的注解是搞不懂这些问题的,要想真正知道注解内部的秘密,要自己定义注解,然后在程序中获取注解信息,拿到注解信息后,就可以为我所用了。
下面我简单演示下三类注解的用法:类注解、方法注解、字段(也称之域)注解的定义与适用,并看看如何获取注解的信息。
一、定义注解
package lavasoft.anntest;

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target;

/** 
* 类注解 

* @author leizhimin 2009-12-18 14:15:46 
*/

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface MyAnnotation4Class { 
        public String msg(); 
}

package lavasoft.anntest;

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target;

/** 
* 方法注解 

* @author leizhimin 2009-12-18 14:16:05 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface MyAnnotation4Method { 
        public String msg1();

public String msg2(); 
}

package lavasoft.anntest;

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target;

/** 
* 字段注解 

* @author leizhimin 2009-12-18 15:23:12 
*/ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface MyAnnotation4Field { 
        public String commont();

public boolean request(); 
}

二、写一个类,用上这些注解
package lavasoft.anntest;

/** 
* 一个普通的Java类 
*/ 
@MyAnnotation4Class(msg = "测试类注解信息") 
class TestClass { 
        @MyAnnotation4Field(commont = "成员变量的注解信息", request = true) 
        private String testfield;

@MyAnnotation4Method(msg1 = "测试方法注解信息1", msg2 = "测试方法注解信息2") 
        public void testMethod() { 
                System.out.println("Hello World!"); 
        } 
}

三、测试注解
为了使用注解,需要通过反射获取注解的对象。通过注解对象来操作注解信息。
package lavasoft.anntest;

import java.lang.reflect.Field; 
import java.lang.reflect.Method;

/** 
* 测试类 

* @author leizhimin 2009-12-18 14:13:02 
*/ 
public class TestOptAnnotation { 
        public static void main(String[] args) throws NoSuchMethodException, NoSuchFieldException { 
                TestClass t = new TestClass(); 
                System.out.println("-----------MyAnnotation4Class注解信息---------"); 
                MyAnnotation4Class an4clazz = t.getClass().getAnnotation(MyAnnotation4Class.class); 
                System.out.println(an4clazz.msg()); 
                System.out.println("-----------MyAnnotation4Method注解信息---------"); 
                Method method = t.getClass().getMethod("testMethod", new Class[0]); 
                MyAnnotation4Method an4method = method.getAnnotation(MyAnnotation4Method.class); 
                System.out.println(an4method.msg1()); 
                System.out.println(an4method.msg2()); 
                System.out.println("-----------MyAnnotation4Field注解信息---------"); 
                Field field = t.getClass().getDeclaredField("testfield"); 
                MyAnnotation4Field an4field = field.getAnnotation(MyAnnotation4Field.class); 
                System.out.println(an4field.commont()); 
                System.out.println(an4field.request()); 
        } 
}

运行结果:
-----------MyAnnotation4Class注解信息--------- 
测试类注解信息 
-----------MyAnnotation4Method注解信息--------- 
测试方法注解信息1 
测试方法注解信息2 
-----------MyAnnotation4Field注解信息--------- 
成员变量的注解信息 
true

Process finished with exit code 0

四、总结
看完上面的测试过程,Annotation已经不再神秘了,这里总结下自定义注解的使用方法:
1、自定义注解,注意注解的时空范围,简单说就是注解针对的目标(类、方法、字段),以及注解的时效(运行时、或者源码中有效)。
 
2、要获取注解的信息,必须通过Java的反射技术来获取Annotation对象,因为你除此之外没有别的获取注解对象的方法。
 
3、获取了注解对象,就可以调用注解的方法来获取相对应的值了。为基础框架所用。
 
4、当然,注解也可以没有定义成员,这样注解就成了一个标记符号了。
理解了这些,注解就不再神秘了。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/245407,如需转载请自行联系原作者

揭开Annotation的面纱相关推荐

  1. python可以干什么-Python可以用来做什么 为你揭开python神秘面纱

    Python可以用来做什么 为你揭开python神秘面纱 时间:2018-01-24     来源:解读Python 最近,编程界又一语言可谓是着实又火了一把,什么语言呢?python,python为 ...

  2. 偷梁换柱——揭开多态的面纱

    偷梁换柱--揭开多态的面纱                                     --从C++到.NET   声明:本文的前半部分纯粹是为初学者写的,如果你对C++对象模型稍有了解, ...

  3. Android开源框架Afinal第一篇——揭开圣女的面纱

    Android开源框架Afinal第一篇--揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在 ...

  4. python可以给你干什么-Python可以用来做什么 为你揭开python神秘面纱

    Python可以用来做什么 为你揭开python神秘面纱 时间:2018-01-24     来源:解读Python 最近,编程界又一语言可谓是着实又火了一把,什么语言呢?python,python为 ...

  5. 微信支付官方揭开刷脸支付神秘面纱

    无利不起早这句话经久不衰,想要提高用户的站粘性,就必须在服务或附加值上面花点心思.微信青蛙Pro就是二者之间的建设桥梁,它将给予消费者一种全新的支付体验.今年,刷脸支付大面积普及,各种消息不胫而走,好 ...

  6. Machine Learning -- 揭开机器学习的面纱

    揭开机器学习的面纱 1. 何为机器学习? 2. 机器学习的前世今生 3. 机器学习的常用算法 4.机器学习的分类 4.1 按照学习方式类 4.1.1 监督学习 4.1.2 无监督学习 4.1.3 强化 ...

  7. 基于wayland的linux桌面,揭开Wayland的面纱 - iTech - 博客园

    揭开Wayland的面纱 - iTech - 博客园 (2011-11-30 22:38:22) 标签: 锦衣夜行 娱乐 如果在两年前,按照那篇<Wayland:Linux的新X Server& ...

  8. 柔宇六周年庆2000人齐聚,揭开“柔性星球”面纱

    深圳2018年8月13日电 /美通社/ -- 2018年8月1日,柔宇迎来第6个生日.6年前的这一天,3个人.3个小花篮组成了最简单的开业庆典,6年后的这一天,柔宇已经汇聚了来自15个国家和地区的20 ...

  9. 冰河浅析 - 揭开***的神秘面纱

    一.基础篇(揭开***的神秘面纱) 无论大家把***看得多神秘,也无论***能实现多么强大的功能,***,其实质只是一个网络客户/服务程序.那么,就让我们从网络客户/服务程序的编写开始. 1.基本概念 ...

最新文章

  1. 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览
  2. 含类定义的完整python程序_Python——变量,运算,条件,循环
  3. 第四范式携AIOS平台亮相2021年世界互联网领先科技成果征集活动
  4. NodeJs实现自定义分享功能,获取微信授权+用户信息
  5. 红黑树实现——STL中的map
  6. quartz 时间配置规则
  7. fatal: could not read Username for 'https://github.com': No such file or directory
  8. python画简单图-python绘制简单彩虹图
  9. 64位Ubuntu14.04搭建ADT开发环境
  10. resourcehacker
  11. Zynq7000(XC7Z045FF900)硬件开发完整指南
  12. 辅导班师资力量介绍!
  13. git commit 命令详解
  14. 用晨曦记账本记账,设置背景、文字颜色
  15. 知识图谱-生物信息学-医学顶刊论文(Bioinformatics-2021)-SumGNN:通过有效的KG聚集进行多类型DDI预测
  16. 2020牛客暑期多校训练营(第八场) Enigmatic Partition
  17. 编码 人的语言与机器语言转换
  18. 设计用于汽车和车身SPC58NH92C3RMI0X\SPC560B50L1B4E0X微控制器
  19. 模式匹配——BF算法
  20. 【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)

热门文章

  1. 番外:Spring MVC环境搭建和Mybatis配置避坑篇
  2. Openstack组件实现原理 — Keystone认证功能
  3. Nutch插件开发及发布流程
  4. IPsec ××× 配置實例
  5. MySQL Xtrabackup备份和恢复
  6. sqlite3数据的使用(xcode 7,ios9)
  7. Java多线程编程实战:模拟大量数据同步
  8. MyBatis的扩展点(plugins)
  9. Android定制:修改开机启动画面
  10. Safari 有望支持 WebP