最近对spring源码感兴趣,今天看到annotation部分,略记之。
一. 最常见的annotation
  • @Override:用在方法之上,用来告诉别人这一个方法是改写父类的
  • @Deprecated:建议别人不要使用旧的API的时候用的,编译的时候会用产生警告信息,可以设定在程序里的所有的元素上.
  • @SuppressWarnings:暂时把一些警告信息消息关闭
  • @Entity:表示该类是可持久化的类
二. 设计一个自己的Annotation
先看代码再讲话
1. 只有一个参数的Annotation实现
[java] view plaincopyprint?
  1. package chb.test.annotation;
  2. import java.lang.annotation.Documented;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. @Target(ElementType.TYPE)
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Documented
  10. public @interface MyAnnotation1 {
  11. String value();
  12. }

package chb.test.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyAnnotation1 {String value(); }

2. 有两个参数的Annotation实现
[java] view plaincopyprint?
  1. package chb.test.annotation;
  2. import java.lang.annotation.Documented;
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. @Target(ElementType.METHOD)
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Documented
  10. public @interface MyAnnotation2 {
  11. String description();
  12. boolean isAnnotation();
  13. }

package chb.test.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyAnnotation2 {String description();boolean isAnnotation(); }

3. Annotation实验类
[java] view plaincopyprint?
  1. package chb.test.annotation;
  2. @MyAnnotation1("this is annotation1")
  3. public class AnnotationDemo {
  4. @MyAnnotation2(description="this is annotation2",isAnnotation=true)
  5. public void sayHello(){
  6. System.out.println("hello world!");
  7. }
  8. }

package chb.test.annotation; @MyAnnotation1("this is annotation1") public class AnnotationDemo {@MyAnnotation2(description="this is annotation2",isAnnotation=true)public void sayHello(){System.out.println("hello world!");} }

4.Annotation测试说明类
[java] view plaincopyprint?
  1. package chb.test.annotation;
  2. import java.lang.reflect.Method;
  3. import org.junit.Test;
  4. public class TestAnnotation {
  5. @Test
  6. public void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException{
  7. Class<?> cls = Class.forName("chb.test.annotation.AnnotationDemo");
  8. boolean flag = cls.isAnnotationPresent(MyAnnotation1.class);
  9. if(flag){
  10. System.out.println("判断类是annotation");
  11. MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class);
  12. System.out.println(annotation1.value());
  13. }
  14. Method method = cls.getMethod("sayHello");
  15. flag = method.isAnnotationPresent(MyAnnotation2.class) ;
  16. if(flag){
  17. System.out.println("判断方法也是annotation");
  18. MyAnnotation2 annotation2 = method.getAnnotation(MyAnnotation2.class);
  19. System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());
  20. }
  21. }
  22. }

package chb.test.annotation; import java.lang.reflect.Method; import org.junit.Test; public class TestAnnotation {@Testpublic void test() throws ClassNotFoundException, SecurityException, NoSuchMethodException{Class<?> cls = Class.forName("chb.test.annotation.AnnotationDemo");boolean flag = cls.isAnnotationPresent(MyAnnotation1.class);if(flag){System.out.println("判断类是annotation");MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class);System.out.println(annotation1.value());}Method method = cls.getMethod("sayHello");flag = method.isAnnotationPresent(MyAnnotation2.class) ;if(flag){System.out.println("判断方法也是annotation");MyAnnotation2 annotation2 = method.getAnnotation(MyAnnotation2.class);System.out.println(annotation2.description()+"/t"+annotation2.isAnnotation());}}}

实验结果,控制台打出如下信息:
判断类是annotation
this is annotation1
判断方法也是annotation
this is annotation2     true
三.简介及说明
1. MyAnnotation1中的@Target(ElementType.TYPE)
@Target里面的ElementType是用来指定Annotation类型可以用在哪些元素上的.例如:
TYPE(类型)、FIELD(属性)、METHOD(方法)、PARAMETER(参数)、CONSTRUCTOR(构造函数)、LOCAL_VARIABLE(局部变量),、PACKAGE(包),其中的TYPE(类型)是指可以用在Class,Interface,Enum和Annotation类型上。
2. MyAnnotation1中的@Retention(RetentionPolicy.RUNTIME)
RetentionPolicy 共有三种策略,分别为:
  • SOURCE:这个Annotation类型的信息只会保留在程序源码里,源码如果经过了编译之后,Annotation的数据就会消失,并不会保留在编译好的.class文件里面
  • CLASS:这个Annotation类型的信息保留在程序源码里,同时也会保留在编译好的.class文件里面,在执行的时候,并不会把这些信息加载到JVM中。注:默认策略为CLASS类型
  • RUNTIME:表示在源码、编译好的.class文件中保留信息,在执行的时候会把这一些信息加载到JVM中去的
3. MyAnnotation1中的@Documented
目的就是将这一Annotation的信息显示在JAVA API文档上,如果没有增加@Documented的话,JAVA API文档上不会显示相关annotation信息
4. MyAnnotation1中的@interface
关键字,表示该类为Annotation定义
5. MyAnnotation1中的 String value();
表示有一个成员参数,名字为value,访问权为默认(default)修饰符,注意以下两点:
  • 访问权只能用public和默认(default)修饰
  • 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组
6.AnnotationDemo中的@MyAnnotation1("this is annotation1")
因为MyAnnotation1只有一个参数,因此可以直接在括号中写上value值。注:如果Annotation只有一个参数,则建议最好将该参数名称定义为value
7.TestAnnotation中的cls.isAnnotationPresent(MyAnnotation1.class)
判断该类是否使用了MyAnnotation1的注释
8. TestAnnotation中的MyAnnotation1 annotation1 = cls.getAnnotation(MyAnnotation1.class)
返回该类针对MyAnnotation1的注释
9. TestAnnotation中的method.isAnnotationPresent(MyAnnotation2.class)
判断该方法是否使用了MyAnnotation2的注释

JAVA annotation入门相关推荐

  1. Java Annotation 入门

    摘要: 本文针对java初学者或者annotation初次使用者全面地说明了annotation的使用方法.定义方式.分类.初学者可以通过以上的说明制作简 单的annotation程序,但是对于一些高 ...

  2. java annotation入门_JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  3. Java Annotation手册

    版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 作者:cleverpig(作者的Blog: http://blog.matrix.org.cn/page/cle ...

  4. Java Cache 入门

    什么是缓存 术语缓存在计算机中无处不在.在应用程序设计的上下文中,它经常被用来描述应用程序开发人员利用单独的内存或低延迟的数据结构.缓存,用于临时存储或缓存信息的副本或引用,应用程序可能会在稍后的某个 ...

  5. java从入门到精通二十四(三层架构完成增删改查)

    java从入门到精通二十四(三层架构完成增删改查) 前言 环境准备 创建web项目结构 导入依赖和配置文件 创建层次模型 实现查询 实现添加 实现修改 完成删除 做一个用户登录验证 会话技术 cook ...

  6. java从入门到精通二十三(Servlet)

    java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...

  7. java从入门到精通第四版明日科技书籍简介及下载

    Java从入门到精通(第4版)(附光盘) 平装 – 2016年10月20日 <Java从入门到精通(第4版)(附光盘)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用 ...

  8. java从入门到精通 ppt_《Java从入门到精通》第4版全书完整PPT课件

    [实例简介] <Java从入门到精通>第4版全书完整PPT课件 [实例截图] [核心代码] e3a1ab08-ca73-47e5-9a3a-bec0b60c991a └── <Jav ...

  9. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!

    java从入门到精通,让我来告诉你! 毫无疑问,java是当下最火的编程语言之一.对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握java看似是一件十分困难的事.其实,只要掌握了科学的学习方法 ...

最新文章

  1. linux变量inode,linux字符cdev和Inode的关系
  2. yapi 插件_强大的开源API接口可视化管理平台——YAPI
  3. 张迈机器人_财会类专业建设改革千人高峰论坛圆满召开!
  4. JAVA复习(二维数组——快排——迷宫)
  5. javaWeb开发总结 ---- 前端数据插入到后台
  6. 实验报告总结_小学四年级数学下册全册知识点总结 ,家有四年级学生的家长收藏...
  7. 页面url带参数_微信小程序云开发教程微信小程序的JS高级页面间数据传递
  8. python爬虫实例手机_python爬虫实例详解
  9. 数据结构拾遗(2) --红黑树的设计与实现(中)
  10. maven项目部署到Repository(Nexus)
  11. 在GridView中加入单选按钮RadioButton
  12. [转]学习object-c,补习一下指针
  13. 米家扫地机器人怎么加水_最省心的扫地机器人,米家扫地机器人1C:视觉动态导航实力强劲...
  14. 1080 MOOC期终成绩(25 分)
  15. 【计算机网络】网络安全 : 对称密钥分配 ( 密钥分配 | 密钥分配中心 KDC | 对称密钥分配 | 密钥分配协议 | Kerberos 协议 )
  16. (二)验证码模块(随机英文验证and随机英文数字混合验证+Session)
  17. 自旋锁、阻塞锁、重入锁、偏向锁、轻量锁和重量锁
  18. CSP认证:行车路线
  19. 首个汽车信息安全ISO国际标准正式发布ISO-SAE 21434
  20. python DataFrame数据合并 merge()、concat()方法

热门文章

  1. shell数值大小的比较
  2. php intval trim,php数据入库前清理 注意php intval与mysql的int取值范围不同_PHP教程
  3. 4-4:TCP协议之TCP头部格式详解
  4. std::string::assign 崩溃的问题
  5. Qt之系统托盘(QSystemTrayIcon详解)
  6. 关于Ubuntu中 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)解决方案
  7. 【Linux 线程】常用线程函数复习《三》
  8. P1955 [NOI2015]程序自动分析 离散化学习 lower_bound学习
  9. MySQL命令:增删与改
  10. 【原】Mysql存储关联数组