【Java 注解】自定义注解 ( 注解解析 )
文章目录
- 一、定义注解
- 二、使用注解
- 三、解析注解
- 四、通过注解对象获取注解属性的原理
在 【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 注解】自定义注解 ( 注解解析 )相关推荐
- java注解,通过反射解析注解,模仿hibernate,获取sql语句。
常用注解: 自定义注解,标准格式: 1,target:注解作用域 2,Retention:声明周期 运行子类继承,但是子类继承只能作用到类注解,字段注解,是继承不了的. 使用注解:通过下面这种方式,为 ...
- [转] Java @interface 自定义注解
[From] http://blog.csdn.net/afterlife_qiye/article/details/53748973 1. 注解的好处 注解可以替代配置文件完成对某些功能的描述,减少 ...
- java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点:元数据 注解的分类 内置注解 自定义注解 注解处理器 Serv ...
- java注解 自定义策略传参_Java注解教程及自定义注解
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- Java Annotation自定义注解详解
在开发过程中总能用到注解,但是从来没有自己定义过注解.最近赋闲在家,研究整理了一番,力求知其然知其所以然. 本文会尝试描述什么是注解,以及通过一个Demo来说明如何在程序中自定义注解.Demo没有实际 ...
- java之自定义注解的完整使用
小坏java自定义注解的完整使用 一.何为java注解之道 1.java 注解的理解之道 2.java 注解的使用示例之道 3.Java 如何自定义注解之道 4.java 元注解之道 5.java 如 ...
- 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class
文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...
- Java通过自定义注解执行方法_Java自定义注解(使用篇)
TL;DR Java 注解广泛运用在开发之中,用于增强变量/方法/类等. 尝试说明 Java 自定义注解的使用,以及通过开源项目中的使用进行说明. 本文主要记录个人的理解,全文基于Java SE8. ...
- Java中自定义注解的使用
Java中自定义注解的使用 一般来说,市面上有一些的框架,企业都不会直接拿过来就用,通过会做二次开发或封装,为了更加适配自己的开发规范和业务.那么在封装或适配的过程中,自定义注解就起着比较重要的作用. ...
- java 获取自定义参数类型_Springboot中使用自定义参数注解获取 token 中用户数据...
使用自定义参数注解获取 token 中User数据 使用背景 在springboot项目开发中需要从token中获取用户信息时通常的方式要经历几个步骤 拦截器中截获token TokenUtil工具类 ...
最新文章
- Gartner评出2017年最值得关注的11个顶级信息安全技术
- Spring学习7之自动装配Bean03
- gdi画平滑直线_石膏几何体不会画?那是你没有画过这些,学会画石膏很简单,收藏...
- zend studio 9实用快捷键大全 分享ZEND STUDIO 9的常用快捷键,高亮显示相同变量。...
- JS基础入门篇( 一 )
- 算法属于计算机服务还是软件,第06讲 服务器软件设计的算法和问题
- 3.12 SE11创建锁对象
- 海外召回1700辆,奔驰首款电动汽车要在中国上市了
- SpringCloud工作笔记089---SpringBoot中Mybatis使用Condition_Criteria如何筛选日期类型数据
- java 绘图 渐变_在CAShapeLayer图形下方绘制渐变
- c语言 char *b,C语言:char*a,*b; *b*=a是什么意思? 如图所示
- oracle中的new old 关键字
- DNA和纳米(Nano)Fusion技术的发展趋势
- qint64转字符串
- [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle
- grub4dos 制作WIN7、WINPE2003、Ubuntu、dos工具箱多启动U盘 (不量产)
- Visio画图完成复制到word中字母间距看着有差别-解决方案
- 复旦大学邢晓渝:无监督句法分析模型里面的监督信号
- 圣剑传说 玛娜传奇(Legend of Mana)(LOM)全武器取得方法
- C#:BackgroundWorker的简单使用