java注解概念

  Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法

java注解介绍

  常用注解

  @Override:表示方法是重写的方法

  @Deprecated:过时的方法

  @SuppressWarnings:抑制警告

  注解分类

  按照运行机制分

  1、源码注解:注解只在源码中存在,编译成.class文件就不存在了

  2、编译时注解:注解在源码和.class文件中都存在,如@Override

  3、运行时注解:在运行阶段起作用,甚至会影响运行逻辑,如@Autowired

  按照来源分

  1、JDK自带注解

  2、第三方注解

  3、自定义注解

自定义注解和使用

  1、使用@interface关键定义注解(Description.java),如下:

  1. package com.hd;
  2.  
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Inherited;
  6. import java.lang.annotation.Retention;
  7. import java.lang.annotation.RetentionPolicy;
  8. import java.lang.annotation.Target;
  9.  
  10. /**
  11. * 注解的注解:元注解
  12. *
  13. * 注解作用域
  14. ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上
  15. ElementType.FIELD:允许作用在属性字段上
  16. ElementType.METHOD:允许作用在方法上
  17. ElementType.PARAMETER:允许作用在方法参数上
  18. ElementType.CONSTRUCTOR:允许作用在构造器上
  19. ElementType.LOCAL_VARIABLE:允许作用在本地局部变量上
  20. ElementType.ANNOTATION_TYPE:允许作用在注解上
  21. ElementType.PACKAGE:允许作用在包上
  22.  
  23. 注解的生命周期
  24. RetentionPolicy.SOURCE:当前注解编译期可见,不会写入 class 文件
  25. RetentionPolicy.CLASS:类加载阶段丢弃,会写入 class 文件
  26. RetentionPolicy.RUNTIME:永久保存,可以反射获取
  27. *
  28. */
  29. // 注解的作用域
  30. @Target({ElementType.METHOD, ElementType.TYPE})
  31. // 注解的生命周期
  32. @Retention(RetentionPolicy.RUNTIME)
  33. // 允许子类继承
  34. @Inherited
  35. // 生成javadoc的时候生成注解的信息
  36. @Documented
  37. // @interface:使用@interface关键定义注解
  38. public @interface Description {
  39.  
  40. // 注解的成员
  41. // 成员类型所限的,合法的类型包括原始数据类型及String、Class、Annotation、Enumeration
  42. String desc();
  43.  
  44. String author();
  45.  
  46. // 成员以无参无异常方式生命,可以用default为成员指定一个默认值
  47. int age() default 18;
  48.  
  49. // 如果注解成员只有一个时,成员名必须取名未value(),在使用时可以忽略成员名和赋值号(=)
  50. // 注解可以没有成员,没有成员的注解成为标识注解
  51. }

  2、在普通类上使用注解,使用方法

    注解使用: @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)

    如下:

  1. package com.hd;
  2.  
  3. /**
  4. * 注解使用:
  5. * @<注解名>(<成员名1>=<成员值1>, <成员名2>=<成员值2>, ...)
  6. * @author H__D
  7. * @date 2019-07-09 22:49:32
  8. *
  9. */
  10. @Description(desc="I am class annotation", author="hd")
  11. public class TestDescription {
  12.  
  13. @Description(desc="I am method annotation", author="hd")
  14. public String test(){
  15.  
  16. return "red";
  17. }
  18.  
  19. }

  3、解析注解,通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑

  1. package com.hd;
  2.  
  3. import java.lang.annotation.Annotation;
  4. import java.lang.reflect.Method;
  5.  
  6. /**
  7. * 解析注解
  8. * 通过反射获取类,函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑
  9. *
  10. * 对于一个类或者接口来说,Class 类中提供了以下一些方法用于反射注解。
  11. getAnnotation:返回指定的注解
  12. isAnnotationPresent:判定当前元素是否被指定注解修饰
  13. getAnnotations:返回所有的注解
  14. getDeclaredAnnotation:返回本元素的指定注解
  15. getDeclaredAnnotations:返回本元素的所有注解,不包含父类继承而来的
  16. *
  17. * @author H__D
  18. * @date 2019-07-09 22:52:42
  19. *
  20. */
  21. public class ParseDecription {
  22.  
  23. public static void main(String[] args) {
  24. // TODO Auto-generated method stub
  25. // 1、使用类加载器加载类
  26. try {
  27. Class c = Class.forName("com.hd.TestDescription");
  28. System.out.println(c);
  29.  
  30. // 2、找到类上面的注解
  31. boolean isExist = c.isAnnotationPresent(Description.class);
  32.  
  33. if(isExist) {
  34. // 3、拿到注解实例
  35. Description d = (Description) c.getAnnotation(Description.class);
  36. System.out.println("========parse class annotation=========");
  37. System.out.println("desc = " + d.desc());
  38. System.out.println("author = " + d.author());
  39. System.out.println("age = " + d.age());
  40. }
  41.  
  42. // 4、找到方法上的注解
  43. Method[] ms = c.getMethods();
  44. for (Method m : ms) {
  45. boolean isMExist = m.isAnnotationPresent(Description.class);
  46. if(isMExist) {
  47. Description d = m.getAnnotation(Description.class);
  48. System.out.println("========parse method annotation=========");
  49. System.out.println("desc = " + d.desc());
  50. System.out.println("author = " + d.author());
  51. System.out.println("age = " + d.age());
  52. }
  53. }
  54.  
  55. // 另外一种解析方法
  56. for (Method m : ms) {
  57. Annotation[] annotations = m.getAnnotations();
  58. for (Annotation annotation : annotations) {
  59. if(annotation instanceof Description) {
  60. System.out.println("========parse method annotation other way=========");
  61. Description d = (Description) annotation;
  62. System.out.println("desc = " + d.desc());
  63. System.out.println("author = " + d.author());
  64. System.out.println("age = " + d.age());
  65. }
  66. }
  67. }
  68.  
  69. } catch (ClassNotFoundException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. }
  74. }

  4、运行结果如下:

    

  

【JAVA】java注解的自定义和使用的更多相关文章

  1. [2]注解(Annotation)-- 深入理解Java:注解(Annotation)自定义注解入门

    转载 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 深入理解Java:注解(Annotation)自定义注解入门 要深入学习 ...

  2. java 利用反射完成自定义注解

    元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: 1.@ ...

  3. Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

  4. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

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

  5. 深入理解Java:注解

    注解作用:每当你创建描述符性质的类或者接口时,一旦其中包含重复性的工作,就可以考虑使用注解来简化与自动化该过程. Java提供了四种元注解,专门负责新注解的创建工作. 元注解 元注解的作用就是负责注解 ...

  6. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  7. paip.Java Annotation注解的作用and 使用

    paip.Java Annotation注解的作用and 使用 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog. ...

  8. Java之注解

    package com.demo.test; import java.lang.annotation.Documented; import java.lang.annotation.ElementTy ...

  9. Java核心 --- 注解

    Java核心——注解 注解是jdk5以后的新特性,Spring和Hibernate等框架提供了注解的配置方式使用, 本文参考了浪曦风中叶的注解讲解,主要讲解jdk内置注解的用法,注解的声明和定义,以及 ...

  10. java基础-注解Annotation原理和用法

    在很多java代码中都可以看到诸如@Override.@Deprecated.@SuppressWarnings这样的字符,这些就是注解Annotation.注解最早在jdk5中被引入,现在已经成为j ...

随机推荐

  1. 快速IO

    namespace IO { #define gc() (iS==iT?(iT=(iS=ibuff)+fread(ibuff,1,SIZ,stdin),(iS==iT?EOF:iS++)):iS++) ...

  2. 《S》读后感

    利用周末时间读完了<S>,有一幅画面在脑袋里挥之不去:一条急湍直下的河,岸边茂密的枝叶延伸到河面上,很多人被河水冲向前方,每个人的眼里都夹杂着凄凉与愤怒,时不时回头,,想同这河水做一次歇斯 ...

  3. Appium环境搭建(Mac)

    为什么选择Mac做自动化测试? 既可以做iOS端的测试也可以进行Android端测试 Mac运行效率相对于Win要高很多,可以真正发挥appium的功能 环境依赖 Node.js Appium App ...

  4. python是什么编程语言。

    python是一门动态解释性的强类型定义语言.

  5. BZOJ 2502 清理雪道(有源汇上下界最小流)

    题面 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向. 你的团队负责每周定时清理雪道.你们拥有一架直升飞机, ...

  6. SPA项目开发--表单验证、增删改

    1. 表单验证 Form组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,   并将Form-Item的prop属性设置为需校验的字段名即可      <el-form- ...

  7. Mac 下Wireshark 找不到网卡

    终端上面,执行如下命令: sudo chgrp admin /dev/bpf* sudo chmod g+rw /dev/bpf*

  8. boost.tribool

    tribool boost.tribool类似c++内建的bool类,但基于三态的布尔逻辑,在true和false之外还有一个indeterminate状态.一个例子场景是执行某项任务,在执行之前状态 ...

  9. php自定义函数之变量作用域

    我们通过前面的章节函数定义部份的学习我们知道了几个不同的规矩: 函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系.仅仅是在函数内部执行大理石量具哪家好 函数内声明的变量 ...

  10. learning java 访问文件和目录

    import java.io.File; import java.io.IOException; public class FileTest { public static void main(Str ...