自定义注解以及获取注解
来源:互联网 发布:java 泛型实现通用dao 编辑:程序博客网 时间:2024/05/23 01:18
自定义和解析注解
一、前言
注解(Annotation)作为元数据的载体,为程序代码本身提供额外的信息,使用过MyBatis等ORM框架的朋友对 @Insert 的注解应该不陌生了,这是MyBatis自定义的注解,显然我们也可以按需求自定义一些注解,然后对其进行解析获取元数据,进而实现通过代码生成代码的操作。
二、自定义注解
只需通过 关键字@interface 即可自定义注解
// 标识注解(就是无属性的注解)public @interface AnnotationWithoutProperty{}// 带value属性的注解public @interface AnnotationWithVal{ String value();}// 带myVal属性的注解public @interface AnnotationWithMyVal{ String[] myValue();}// 带value和myVal属性的注解public @interface AnnotationWith2Val{ String value(); String[] myValue();}// 带缺省值的myVal属性的注解public @interface AnnotationWithDefaultVal{ String myVal() default "hello world!";}
使用方式如下:
@AnnotationWithoutProperty@AnnotationWithVal("hello world") // value属性赋值时,不用显式写出属性名@AnnotationWithMyVal(myValue={"hello", "world"}) // 其他属性赋值时,必须显示写出属性名@AnnotationWith2Val(value="hello world", myVal={"hello", "world"})@AnnotationWithDefaultVal // 属性拥有缺省值时,不必显示设置属性值@AnnotationWithDefaultVal("new value")public void test(){}
三、注解的注解
注解的注解就是为注解本身提供额外的信息,从而约束或增强注解的能力。其中包含有 @Documented 、 @Inherited 、 @Target 、 Retention 4种注解。
@Target注解 :用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败。
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
// 约束@MyAnnotation的作用范围是函数和构造函数@Target(ElementType.METHOD, ElementType.CONSTRUCTOR)public @interface MyAnnotation{}
@Retention注解 :用于约束被描述的注解的作用范围,注解的作用范围有三个,分别为
1. RetentionPolicy.SOURCE ,作用范围为源码,就是仅存在于java文件中,当执行 javac 命令时将会去除该注解。
2. RetentionPolicy.CLASS ,作用范围为二进制码,就是存在于class文件中,当执行 java 命令时会去除该注解。
3. RetentionPolicy.RUNTIME ,作用范围为运行时,就是我们可以通过反射动态获取该注解。
@Retention(RetentionPolicy.RUNTIME)public @interface MyAnnotation{}
@Documented注解 :用于指定javadoc生成API文档时显示该注解信息
@Inherited注解 :用于指定被描述的注解可以被其所描述的类的子类继承。默认情况
// 默认注解不会被子类继承@MyAnnotationpublic class Parent{}// Son并没有继承注解MyAnnotationpublic class Son extends Parent{}
通过 @Inherited 子类将会继承父类的 @MyAnnoation注解 。
四、读取注解
通过反射我们可以获取类、函数等上的注解信息。
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.CLASS)@Documentedpublic @interface MyAnnotaion{ String value() default "hello world";}@MyAnnotationpublic class Test{ public static void main(String[] args){ MyAnnotation ma = Test.class.getAnnotation(MyAnnotation.class); System.out.println(ma.value()); // 获取自身和从父类继承的注解 Annotation[] annotations = Test.class.getAnnotations(); // 仅获取自身的注解 Annotation[] annotations = Test.class.getDeclaredAnnotations(); }}
- 自定义注解以及获取注解
- java中的注解以及自定义注解
- Java基本注解以及了解自定义注解
- 注解的简单介绍以及自定义注解
- Java 自定义注解以及注解解析器
- Annotation(自定义注解)反射获取注解
- Java自定义注解和反射获取注解
- java 自定义注解,获取注解信息
- Java注解学习:注解术语以及自定义注解
- spring mvc框架源码分析(二)-自定义注解以及通过反射获取注解
- java自定义注解以及原理
- springMvc 自定义注解以及自定义异常处理
- java注解:java中常见的第三方注解,自定义注解以及元注解
- Java注解-自定义注解
- 【注解】02.自定义注解
- Java注解----自定义注解
- Java注解自定义注解
- 【Java】【注解】自定义注解
- HTML5 Web Sockets与代理服务器交互
- 近几年前端技术盘点以及 2016 年技术发展方向
- iOS UIWebView stringByEvaluatingJavaScriptFromString的用法
- Kruskal最小生成树算法详解,以及java源代码
- 邮件开发:Javamail、JAF简介
- 自定义注解以及获取注解
- Java EE V7.0学习笔记:JPA
- android studio 怎么设置显示作者
- 【Jsoup】HTML解析器,轻松获取网页内容
- ubuntu ftp server-转
- hibernate错误
- Excel文件读取解析
- LeetCode ZigZag Conversion
- 为何使用java反射机制