文章目录

  • 一、定义注解
  • 二、使用注解
  • 三、解析注解
  • 四、通过注解对象获取注解属性的原理

在 【Java 注解】自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ;

在 【Java 注解】自定义注解 ( 元注解 ) 博客中讲解了注解中的元注解如何描述注解 ;

本篇博客开始讲解注解在程序中如何进行 解析 和 使用 ;

注解中定义了 若干 注解属性 , 那么就需要在某个阶段 , 将 注解属性 的值拿出来 , 在某个场合让其发挥出作用 ;

解析注解 : 获取 注解属性 的值 ;

一、定义注解


定义一个注解 :

package annotation;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)
public @interface Property {/*** 注解属性 : 需要反射的类名* @return*/String name();/*** 注解属性 : 需要反射的方法名* @return*/int age();
}

二、使用注解


使用上述 Property 注解 :

@Property(name = "Tom", age = 18)
public class Main {public static void main(String[] args) {}
}

三、解析注解


在 main 函数中解析 Main 类上的 @Property(name = "Tom", age = 18) 注解 ;

首先 , 获取该 Main 类的字节码对象 ; 在哪个类上添加了注解 , 就获取哪个类的字节码文件 ;

// 1. 获取该 Main 类的字节码对象,
//    哪个类上添加了注解 , 就获取哪个类的字节码文件
Class<Main> clazz = Main.class;

然后 , 获取字节码上的注解对象 , 通过调用 getAnnotation 获取指定注解类型的对象 , 也可以调用 getAnnotations 方法 , 获取作用在该字节码类上的所有注解 ;

// 2. 获取字节码上的注解对象
Property propertyAnnotation = clazz.getAnnotation(Property.class);

最后 , 从注解对象中 , 获取注解属性 , 调用 注解属性 对应的抽象方法即可获取 注解属性 值 ;

// 3. 调用 注解对象 中的抽象方法, 获取其返回值
//    注解的本质就是接口, 其中的注解属性本质是 抽象方法
//    注解对象可以直接调用注解超抽象方法,
//      是因为在内存中生成了该 注解 接口的子类对象, 实现了 name 和 age 方法
// 获取注解属性 name
String name = propertyAnnotation.name();
// 获取注解属性 age
int age = propertyAnnotation.age();System.out.println("注解属性值 : name = " + name + " , age = " + age);

完整代码如下 :

package annotation;@Property(name = "Tom", age = 18)
public class Main {public static void main(String[] args) {// 解析注解// 1. 获取该 Main 类的字节码对象,//    哪个类上添加了注解 , 就获取哪个类的字节码文件Class<Main> clazz = Main.class;// 2. 获取字节码上的注解对象Property propertyAnnotation = clazz.getAnnotation(Property.class);// 3. 调用 注解对象 中的抽象方法, 获取其返回值//    注解的本质就是接口, 其中的注解属性本质是 抽象方法//    注解对象可以直接调用注解超抽象方法,//      是因为在内存中生成了该 注解 接口的子类对象, 实现了 name 和 age 方法// 获取注解属性 nameString name = propertyAnnotation.name();// 获取注解属性 ageint age = propertyAnnotation.age();System.out.println("注解属性值 : name = " + name + " , age = " + age);}
}

四、通过注解对象获取注解属性的原理


通过注解对象获取注解属性的原理 :

注解的本质就是接口, 其中的注解属性本质是 抽象方法 , 注解对象可以直接调用注解超抽象方法 , 是因为在内存中生成了该 注解 接口的子类对象, 实现了 name 和 age 方法 , 返回值就是本类注解中的 注解属性值 ;

在 Main 类上标注了 @Property(name = "Tom", age = 18) 注解 , 该 Main 类运行时 , 则在内存中生成的 注解 接口的子类对象 , 大概形式如下 :

public class PropertyImpl implements Property {@Overridepublic String name() {return "Tom";}@Overridepublic int age() {return 18;}
}

因此 , 通过注解属性 , 调用 name 和 age 方法 , 可以获取到注解的 注解属性 值 ;

【Java 注解】自定义注解 ( 注解解析 )相关推荐

  1. java注解,通过反射解析注解,模仿hibernate,获取sql语句。

    常用注解: 自定义注解,标准格式: 1,target:注解作用域 2,Retention:声明周期 运行子类继承,但是子类继承只能作用到类注解,字段注解,是继承不了的. 使用注解:通过下面这种方式,为 ...

  2. [转] Java @interface 自定义注解

    [From] http://blog.csdn.net/afterlife_qiye/article/details/53748973 1. 注解的好处 注解可以替代配置文件完成对某些功能的描述,减少 ...

  3. java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解

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

  4. java注解 自定义策略传参_Java注解教程及自定义注解

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

  5. Java Annotation自定义注解详解

    在开发过程中总能用到注解,但是从来没有自己定义过注解.最近赋闲在家,研究整理了一番,力求知其然知其所以然. 本文会尝试描述什么是注解,以及通过一个Demo来说明如何在程序中自定义注解.Demo没有实际 ...

  6. java之自定义注解的完整使用

    小坏java自定义注解的完整使用 一.何为java注解之道 1.java 注解的理解之道 2.java 注解的使用示例之道 3.Java 如何自定义注解之道 4.java 元注解之道 5.java 如 ...

  7. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  8. Java通过自定义注解执行方法_Java自定义注解(使用篇)

    TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...

  9. Java中自定义注解的使用

    Java中自定义注解的使用 一般来说,市面上有一些的框架,企业都不会直接拿过来就用,通过会做二次开发或封装,为了更加适配自己的开发规范和业务.那么在封装或适配的过程中,自定义注解就起着比较重要的作用. ...

  10. java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...

    使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...

最新文章

  1. Gartner评出2017年最值得关注的11个顶级信息安全技术
  2. Spring学习7之自动装配Bean03
  3. gdi画平滑直线_石膏几何体不会画?那是你没有画过这些,学会画石膏很简单,收藏...
  4. zend studio 9实用快捷键大全 分享ZEND STUDIO 9的常用快捷键,高亮显示相同变量。...
  5. JS基础入门篇( 一 )
  6. 算法属于计算机服务还是软件,第06讲 服务器软件设计的算法和问题
  7. 3.12 SE11创建锁对象
  8. 海外召回1700辆,奔驰首款电动汽车要在中国上市了
  9. SpringCloud工作笔记089---SpringBoot中Mybatis使用Condition_Criteria如何筛选日期类型数据
  10. java 绘图 渐变_在CAShapeLayer图形下方绘制渐变
  11. c语言 char *b,C语言:char*a,*b; *b*=a是什么意思? 如图所示
  12. oracle中的new old 关键字
  13. DNA和纳米(Nano)Fusion技术的发展趋势
  14. qint64转字符串
  15. [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle
  16. grub4dos 制作WIN7、WINPE2003、Ubuntu、dos工具箱多启动U盘 (不量产)
  17. Visio画图完成复制到word中字母间距看着有差别-解决方案
  18. 复旦大学邢晓渝:无监督句法分析模型里面的监督信号
  19. 圣剑传说 玛娜传奇(Legend of Mana)(LOM)全武器取得方法
  20. C#:BackgroundWorker的简单使用

热门文章

  1. 恢复SQL Server被误删除的数据
  2. 洛谷P4015 运输问题 网络流24题
  3. NAT概念解释(不完全版,但不会搞错...)
  4. eclipse 将javaWeb项目转化成maven项目
  5. Selenium测试专项三班隆重开班
  6. 不允许所请求的注册表访问权
  7. HDU 2504 又见GCD
  8. awk 统计数据在文件中的出现次数
  9. JNI学习开始篇 基础知识 数据映射及学习资料收集
  10. jsp cookie 中文乱码 的解决方法