注解简介

注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义。注解主要有三类:元注解、自定义注解以及框架定义的注解。

接口里面的成员方法称为注解的属性

定义了属性,要在使用的时候给属性赋值

如果定义属性时使用default关键字给属性默认初始值,则可以不进行赋值

若只有一个属性且名为value,则使用时可以直接写值

数组赋值时使用 { } 包裹,数组只有一个值时可以不用 { }

元注解

首先我们要知道什么是元注解,元注解可以看作是用在注解上的注解。基础的元注解有四个:

@Target() :描述注解能够作用的位置。

ElementType.FIELD:说明自定义的注解可以用于类的变量

ElementType.METHOD:说明自定义的注解可以用于类的方法

ElementType.TYPE:说明自定义的注解可以用于类本身、接口或 enum类型

@Retention() : 描述注解被保留的阶段

@Retention(RetentionPolicy.RUNTIME):表示注解可以一直保留到运行时,因此可以通过反射获取注解信息

@Retention(RetentionPolicy.CLASS):表示注解被编译器编译进 class文件,但运行时会忽略

@Retention(RetentionPolicy.SOURCE):表示注解仅在源文件中有效,编译时就会被忽略

@Documented : 描述注解是否被抽取到api文档中

@Inherited : 描述注解是否被子类继承

可以看到,在描述注解被保留的阶段的时候,生命周期从长到短的顺序是RUNTIME > CLASS > SOURCE。因此,如果需要使用反射在运行时动态获取注解的信息,是必须使用@Retention(RetentionPolicy.RUNTIME)的,就像接下来要实现的例子一样。

利用注解来校验类中的字段

首先自定义一个注解。

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

public @interface Length {

int min();

int max();

String errorMsg();

}

然后定义一个Person类,包含ID、name以及sex字段,并设置set方法。

public class Person {

@Length(min = 8, max = 8, errorMsg = "错误!id必须为8位!")

private String id;

private String name;

private String sex;

public void setId(String id) {

this.id = id;

}

public void setName(String name) {

this.name = name;

}

public void setSex(String sex) {

this.sex = sex;

}

}

然后我们可以利用反射的原理编写一个测试主函数,看我们自定义的注解是否能够检测字段id是否满足设置的要求。

import java.lang.reflect.Field;

public class lengthTest {

public static String validate(Object object) throws IllegalAccessException {

// 通过反射获取对象的字段

Field[] fields = object.getClass().getDeclaredFields();

// 逐个字段检验,看哪个字段上标了注解

for (Field field : fields) {

if (field.isAnnotationPresent(Length.class)) {

// 如果标了注解,则通过反射获取到该字段上注解的详细信息(包括各种参数)

Length length = field.getAnnotation(Length.class);

// 设置反射后能够得到私有变量

field.setAccessible(true);

// 获取对象字段的实际长度

int value = ((String) field.get(object)).length();

// 检验对象字段实际长度是否合法,合法什么都不做,不合法输出错误信息

if (value < length.min() || value > length.max()) {

return length.errorMsg();

}

}

}

return null;

}

public static void main(String[] args) throws IllegalAccessException {

Person person = new Person();

person.setId("1234567");

person.setName("小美");

person.setSex("女");

System.out.println(validate(person));

}

}

最后,强调一下,反射的知识真的很重要!

java自定义字段_Java自定义注解实战相关推荐

  1. java自定义字段_自定义字段的设计与实现(Java实用版)

    前言 自定义字段又叫做"开放模型",用户可以根据自已的需求,添加需要的字段,实现个性化定制. 使用自定义字段的目的,使用自定义字段解决哪些问题 如现有一套CRM系统,客户模块中客户 ...

  2. java annotation入门_JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  3. java条码大小_java – 自定义条形码输入中缺少条形码高度

    我正在整合FedEx运输API以使用 Java生成标签.一切都很好,但除了这个问题.在为FedEx Freight设置LabelFormatType到COMMON2D或LABEL_DATA_ONLY时 ...

  4. java报文封装_Java自定义协议报文封装 添加Crc32校验的实例

    刚做完的demo,直接进入主题了,开启两个线程,模拟Socket服务端和客户端通信,将数据封装为指定格式报文发送 代码: import java.io.IOException; import java ...

  5. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  6. java自定义线程_Java自定义线程池详解

    自定义线程池的核心:ThreadPoolExecutor 为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效的进行线程控制,其中在java.util.concurrent ...

  7. java错误页面_java自定义错误页面实现方法

    java后台自定义错误页面:(推荐:java视频教程) java后台项目中,经常会出现404或500等错误, 如果不做设置,服务器会默认返回404或500的错误页面 给前端显示错误页面. 掌握了错误页 ...

  8. java interceptor用法_java自定义拦截器用法实例

    本文实例讲述了java自定义拦截器及其用法.分享给大家供大家参考.具体如下: LoginInterceptor.java文件如下: package com.tq365.util; import jav ...

  9. java url 协议_Java自定义URL协议

    Java提供了对URL协议进行扩展的能力,通过扩展用户可以自定义URL通信协议,JDK默认提供了对HTTP,FTP,JAR,FILE等的实现,而当需要自己定义通信协议的时候,就需要利用JDK提供的对U ...

最新文章

  1. 亚马逊:用CNN进行图像分类的Tricks
  2. 人工智能、区块链、混合现实:2019年新闻、媒体与技术趋势
  3. 热门搜索怎么实现_三个步骤教你学会,搜索引擎霸屏技术!
  4. 微软的Surface平板电脑RT版,RT是什么缩写?|转|
  5. 鼓励自己最有效的20个方法
  6. Ettercap-中间人欺骗
  7. [Python] L1-023. 输出GPLT-PAT团体程序设计天梯赛GPLT
  8. java 调用ejb_一步一步教你远程调用EJB
  9. 基于微信小程序的点餐系统源码【包调试运行】
  10. 直播app源代码 直播软件开发的iOS直播推流之h264/aac 硬编码
  11. win查看产品密钥的方法
  12. Roman number -- 罗马数字
  13. (更新)Raspberry Pi OS Lite/Full arm64 Bullseye安装Cutefish桌面
  14. (转)一共81个,开源大数据处理工具汇总
  15. 嵌入式软件工程师 秋招笔试题
  16. ocr 哪个好 外文_OCR软件哪个好?
  17. android 韦根读卡器_维根26磁条卡读卡器|维根34磁条卡读卡器|韦根26磁条卡读卡器|Wiegand 26磁条卡读卡器-深圳市和信达科技...
  18. 《生物信息学:导论与方法》----导论与历史----听课笔记(一)
  19. 小时光扫地机器人圆圆_我也有了扫地机器人“圆圆”,漫天猫毛不愁了
  20. DiscuzX3.4模板W!简论坛风格 适合于资源站等

热门文章

  1. 相册冲印app(小商城)知识点汇总(1)
  2. 用java实现圆柱体体积
  3. java基础 - 关键字private、protected、default、public、final
  4. 联想万全服务器 R630 故障处理
  5. 自动最后一英里交付的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  6. matlab-colormap使用
  7. 【专题5: 硬件设计】 之 【69.开关电源 之 如何计算buck电路占空比和电感的计算】
  8. android 8.0模拟点击,安卓8.0能用的模拟器
  9. 软件测试中心业绩,软件测试人员绩效考核详细
  10. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码