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 自定义注解以及获得注解的值相关推荐

  1. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  2. java 自定义注解_两步实现Java自定义注解

    什么是注解? 注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理. 那么我们怎么去实现自个的注解,也就是自定义注解呢? 一.自定义一个注解( ...

  3. Java自定义注解Annotation的实现原理

    文章目录 1.什么是注解? 2.注解的用处: 3.注解的原理: 4.元注解: 5.常见标准的Annotation: 6.自定义注解: 7.自定义注解实例: 1.什么是注解?   对于很多初次接触的开发 ...

  4. java自定义注解解析及自定义注解

    jdk1.5之后提供了注解(Annotation)这一种语法.其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一 ...

  5. java 自定义注解获取_Java自定义注解

    Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation ...

  6. java 自定义注解_Java注解

    前言 近日在阅读开源项目,发现项目里好多奇奇怪怪的注解(@DataScope.@Log...)看得我一脸懵,不知道大家是否也有过这样的经历,回想了一下,发现自己对于注解的知识,好像只停留在@Overr ...

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

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

  8. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  9. java自定义注解annotation记录操作日志

    说到注解我们平常用的可以说非常多啦,说几个常用的的注解 @RestController @Service @Autowired 这些都是我们平常使用spring框架最常见的注解了,我们只知道它们非常好 ...

最新文章

  1. 如何下载和离线安装Chrome的CRX扩展文件包
  2. kafka java 查询信息_Kafka查看topic、consumer group状态命令
  3. 乡村振兴国际经验-农民丰收节贸易会: 谋定城镇化进程
  4. VTK:图表之EdgeWeights
  5. SpringBoot之Dubbox
  6. Redis学习总结(19)——Redis 5种集群方式对比
  7. bo dto java vo_Java 键对象 KO (key object) 介绍
  8. ajax请求怎么判断没有更多内容,怎么知道ajax 请求完了,想在数据没请求完时,页面有一个loading效果...
  9. 如何为html代码加密
  10. 图像显著性论文(二)—Saliency Detection: A Spectral Residual Approach
  11. 【java】对象克隆protected Object clone() throws CloneNotSupportedException
  12. 【小技巧】H5禁止手机虚拟键盘弹出
  13. linux相关命令------文件内容显示以及文件其他命令
  14. linux 软件包kbd 位置,linux系统安装包的管理
  15. 计算机网络背诵笔记,震惊!网络搜索、数字笔记和云盘,让你变笨!!!
  16. 【91xcz】想在Win8里了解各种炒股资讯吗
  17. 面向垂直行业的5G核心网关键技术演进分析
  18. 百度地图api前端开发总结
  19. java swing qq_java swing实现QQ账号密码输入框
  20. 针对数据库拒绝访问的解决办法以及Mysql数据库的安装环境变量配置一条龙

热门文章

  1. [Java核心技术(卷Ⅰ)] - 判断相等
  2. vue node --- 前后端联系的知识梳理
  3. es6 --- Thunkify源码分析
  4. 软件测试工具LoadRunner中如何定义SLA?--转载
  5. @angular/platform-browser-dynamic
  6. Linux 下实现普通用户只能写入某个目录
  7. 服务器排障 之 nginx 499 错误的解决
  8. 数据的交换输出【杭电-2016】 附题
  9. 关于一道数据库例题的解析。为什么σ age22 (πS_ID,SCORE (SC) ) 选项是错的?
  10. KVO 的进一步理解