java 自定义注解以及获得注解的值
1.自定义注解
import java.lang.annotation.*;@Documented @Target(ElementType.FIELD) @Inherited @Retention(RetentionPolicy.RUNTIME ) public @interface MyAnno {/*** 是否能为null* @return*/boolean isCanNull() default true;/*** 是否能为空字符串* @return*/boolean isCanEmpty() default true;/*** 是否能为0* @return*/boolean isCanZero() default true; }
2.使用注解:
public class Mouse {@MyAnno(isCanNull=true)private String name;@MyAnno(isCanNull = false,isCanZero = false)private int age;@MyAnno(isCanNull = false)private String address;@MyAnno(isCanZero = false)private double money;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} }
3.获得注解的值并对其判断
package com.vweb.util;import com.vweb.webapp.Mouse; import com.vweb.webapp.MyAnno; import com.vweb.webapp.TestUtil; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; public class IntactCheckUtil {public static boolean check(Object obj){// list = Arrays.asList(AnnotationParsing.class.getClassLoader().loadClass(((Class)obj).getClass().getName()).getDeclaredFields());List<Field> list = Arrays.asList(obj.getClass().getDeclaredFields());for(int i=0;i<list.size();i++){Field field = list.get(i);if(field.isAnnotationPresent(MyAnno.class)){//是否使用MyAnno注解for (Annotation anno : field.getDeclaredAnnotations()) {//获得所有的注解if(anno.annotationType().equals(MyAnno.class) ){//找到自己的注解if(!((MyAnno)anno).isCanNull()){//注解的值if(TestUtil.getFieldValueByName(field.getName(),obj)==null){throw new RuntimeException("类:"+Mouse.class+"的属性:"+field.getName()+"不能为空,实际的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}if(!((MyAnno)anno).isCanEmpty()){if(TestUtil.getFieldValueByName(field.getName(),obj).equals("")){throw new RuntimeException("类:"+Mouse.class+"的属性:"+field.getName()+"不能为空字符串,实际的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}if(!((MyAnno)anno).isCanZero()){if(TestUtil.getFieldValueByName(field.getName(),obj).toString().equals("0") || TestUtil.getFieldValueByName(field.getName(),obj).toString().equals("0.0")){throw new RuntimeException("类:"+Mouse.class+"的属性:"+field.getName()+"不能为空字符0,实际的值:"+TestUtil.getFieldValueByName(field.getName(),obj)+",注解:field.getDeclaredAnnotations()");}}}}}}return true;} }
备注:注解各参数的使用(以下内容来自互联网http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html)
@Target:
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。
取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Documented:
该属性用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited:
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
自定义注解:
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。
简单的自定义注解和使用注解实例:
转载于:https://www.cnblogs.com/mouseIT/p/5033746.html
java 自定义注解以及获得注解的值相关推荐
- java 自定义注解 解析_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- java 自定义注解_两步实现Java自定义注解
什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...
- Java自定义注解Annotation的实现原理
文章目录 1.什么是注解? 2.注解的用处: 3.注解的原理: 4.元注解: 5.常见标准的Annotation: 6.自定义注解: 7.自定义注解实例: 1.什么是注解? 对于很多初次接触的开发 ...
- java自定义注解解析及自定义注解
jdk1.5之后提供了注解(Annotation)这一种语法.其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一 ...
- java 自定义注解获取_Java自定义注解
Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation ...
- java 自定义注解_Java注解
前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...
- java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点:元数据 注解的分类 内置注解 自定义注解 注解处理器 Serv ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- java自定义注解annotation记录操作日志
说到注解我们平常用的可以说非常多啦,说几个常用的的注解 @RestController @Service @Autowired 这些都是我们平常使用spring框架最常见的注解了,我们只知道它们非常好 ...
最新文章
- 如何下载和离线安装Chrome的CRX扩展文件包
- kafka java 查询信息_Kafka查看topic、consumer group状态命令
- 乡村振兴国际经验-农民丰收节贸易会: 谋定城镇化进程
- VTK:图表之EdgeWeights
- SpringBoot之Dubbox
- Redis学习总结(19)——Redis 5种集群方式对比
- bo dto java vo_Java 键对象 KO (key object) 介绍
- ajax请求怎么判断没有更多内容,怎么知道ajax 请求完了,想在数据没请求完时,页面有一个loading效果...
- 如何为html代码加密
- 图像显著性论文(二)—Saliency Detection: A Spectral Residual Approach
- 【java】对象克隆protected Object clone() throws CloneNotSupportedException
- 【小技巧】H5禁止手机虚拟键盘弹出
- linux相关命令------文件内容显示以及文件其他命令
- linux 软件包kbd 位置,linux系统安装包的管理
- 计算机网络背诵笔记,震惊!网络搜索、数字笔记和云盘,让你变笨!!!
- 【91xcz】想在Win8里了解各种炒股资讯吗
- 面向垂直行业的5G核心网关键技术演进分析
- 百度地图api前端开发总结
- java swing qq_java swing实现QQ账号密码输入框
- 针对数据库拒绝访问的解决办法以及Mysql数据库的安装环境变量配置一条龙
热门文章
- [Java核心技术(卷Ⅰ)] - 判断相等
- vue node --- 前后端联系的知识梳理
- es6 --- Thunkify源码分析
- 软件测试工具LoadRunner中如何定义SLA?--转载
- @angular/platform-browser-dynamic
- Linux 下实现普通用户只能写入某个目录
- 服务器排障 之 nginx 499 错误的解决
- 数据的交换输出【杭电-2016】 附题
- 关于一道数据库例题的解析。为什么σ age22 (πS_ID,SCORE (SC) ) 选项是错的?
- KVO 的进一步理解