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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux列出管道,lsof列出的管道列表示什么意思?_linux_开发99编程知识库

文件不僅以流形式打開。 其中一些是在 lsof 手冊中列出的&#xff1a;FD is the File Descriptor number of the file or:cwd current working directory;Lnn library references (AIX);err FD information error (see NAME column);jld jail directory (FreeBSD);ltx shared l…

CSS一些实用的技巧

css 字体简写规则当使用css定义字体时你可能会这样做&#xff1a;font-size: 1em;line-height: 1.5em;font-weight: bold;font-style: italic;font-variant: small-caps;font-family: verdana,serif;事实上你可以简写这些属性&#xff1a;font: 1em/1.5em bold italic small-ca…

linux openssh升级8.1,Centos7利用rpm升级OpenSSH到openssh-8.1p1版本

由于近期安全事故频发&#xff0c;打算把机器OpenSSH升级到最新版本&#xff0c;找了一圈&#xff0c;发现分享的rpm包就到7.4版本&#xff0c;最新版已经到8.1.p1&#xff0c;所以博客自编译一个openssh-8.1p1的rpm包进行分享。检查环境&#xff1a;[roottest]# ssh -VOpenSSH…

《HTTP权威指南》 – 11.验证码和新鲜度

服务器应当告知客户端能够将内容缓存多长时间&#xff0c;在这个时间内就是新鲜的。服务器可以用这两个首部之一来提供信息&#xff1a; Expires&#xff08;过期&#xff09;Cache - Control&#xff08;缓存控制&#xff09;Expires首部 规定文档“过期”的具体时间&#xff…

产品经理必备神器推荐

欢迎关注我的公众号&#xff08;同步更新文章&#xff09;&#xff1a;DoNet技术分享平台阅读原文工欲善其事&#xff0c;必先利其器&#xff0c;作为最追求极致体验的产品经理群体&#xff0c;手里有一件趁手的法器&#xff0c;工作起来才会有一种享受般的快感&#xff0c;最近…

野火linux底板设计,野火STM32F767套件(底板+核心板)

一、兑换形式1、电子芯吧客注册用户均可通过免费申请与硬件兑换两种方式进行申请试用2、免费申请形式为用户通过分享试用活动至好友&#xff0c;换取申请板卡一次试用资格3、硬件兑换方式为用户捐赠一块闲置板卡至电子芯吧客&#xff0c;换取申请板卡一次试用资格4、免费申请渠…

c++ builder xe2 (Embarcadero rad studio) 远程调试 同样适用于 delphi 远程调试 教程

c builder xe2 &#xff08;Embarcadero rad studio&#xff09; 远程调试 同样适用于 delphi 远程调试 教程转载于:https://www.cnblogs.com/LittleTiger/p/5039245.html

JS关闭浏览器 (不弹出提示框)

如果网页不是通过脚本程序打开的&#xff08;window.open()&#xff09;&#xff0c;调用window.close()脚本关闭窗口前&#xff0c;必须先将window.opener对象置为null&#xff0c;否则浏览器&#xff08;IE7、IE8&#xff09;会弹出一个确定关闭的对话框。&#xff1c;script…

天大18年c语言离线作业,天大18秋C语言程序设计在线作业一辅导资料.docx-资源下载在线文库www.lddoc.cn...

天大18秋《C语言程序设计》在线作业一辅导资料.docx天大 18 秋C 语言程序设计 在线作业一1、C 2、D 3、D 4、D 5、D 一、单选题共 40 题&#xff0c;100 分1、设有int a 31,0,3,3,4,5,6,7;,则 a21的值是 A3B5C6D4正确答案是C2、设 int a21,b021; 语句 printf“x,dn”,a,b;的输出…

AM335x(TQ335x)学习笔记——GPIO关键驱动移植

或按照S5PV210学习秩序。我们首先解决的关键问题。TQ335x有六个用户按钮&#xff0c;每个上、下、剩下、对、Enter和ESC。我想开始学习S5PV210当同一&#xff0c;写输入子系统驱动器的关键问题要解决&#xff0c;但浏览driver/input/keyboardgpio-keys.c&#xff0c;大体上看下…

程序员偷偷深爱的9个不良编程习惯

新媒体管家下面这9个编码习惯&#xff0c;虽然在编程规则中是被驳斥的&#xff0c;但我们很多人就是会不由自主地使用它们。我们曾经都做过这样的事情&#xff1a;当妈妈不注意的时候&#xff0c;偷偷地吃糖果零食&#xff0c;然后导致有了蛀牙。同样的&#xff0c;我们都违背过…

emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全

基于 Emacs 的 company 模式并配合 semantic 文法分析器&#xff0c;实现 Emacs 的 C/C 代码自动补全。关于 Emacs 的代码自动补全代码自动补全的功能&#xff0c;对于使用 Emacs 写代码的程序员而言其重要性不言而喻的&#xff0c;但是搜了一些所谓的 “Emacs 完美的 C 自动补…

linux(fedora) 下dvwa 建筑环境

linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站。该服务通过休息install 安装 yum install httpd, mysql, php-mysql, php 假设出现安装的问题。能够先yum search xxx 2.安装完之后&#xff0c;检查安装的状…

c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法

要求&#xff1a;从键盘上输入一元二次方程的三个参数&#xff0c;编程判断并求一元二次方程的实根(a,b,c均为整数)算法分析&#xff1a;一元二次方程是只含有一个未知数&#xff0c;且未知数的最高次数是二次的多项式方程。一元二次方程经过整理都可化成一般形式axbxc0(a≠0)&…

程序员如何优雅度过一生的15个建议

首先&#xff0c;我要说明一下精彩的职业生涯应该是什么样。他们不是这样的一个线性图形&#xff0c;不是每过一个月你就会有对应的成长。&#xff08;就算是普通的职业生涯也不会这样。你不会每个月都有提升。每个月你都会变的好一点&#xff0c;但是每次有提升都是大幅度的&a…

cocos2d-x游戏开发 跑酷(四) 关联与物理世界

原创。转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物&#xff0c;可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样&#xff0c;有实际体积&#x…

kmp算法的c语言,KMP算法 纯C实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己写的KMP算法&#xff1a;int nt[256];void get_next1(char* T, int next[], int tlen){int i 0;int j 1;next[0] -1;while( j {if ( T[i] T[j] ){next[j] 0;i;}else{next[j] i;i 0;}j;}}int Index_KMP1(char* S, cha…

MyBatis多条件查询

1.MyBatis多条件查询1.1&#xff1a;使用实体类 将参数封装成对象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…

android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

如何触发广播接收器在GPS开启/关闭&#xff1f;问题描述 投票&#xff1a;35回答&#xff1a;5public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().matches("android.locatio…

sphinx数据文件简析

Sphinx使用的文件包括 “sph”&#xff0c; “spa”&#xff0c; “spi”&#xff0c; “spd”, “spp”&#xff0c; “spm” &#xff0c;还有锁文件&#xff08;.spl&#xff09;。其中sph是系统的配置文件。其它则为索引文件。 l Spi 文件&#xff1a;保存WordId及指向此Wo…