设为首页 - 加入收藏  
您的当前位置:首页 >数据库 >听说你只会用注解,不会自己写注解?那有点危险了 正文

听说你只会用注解,不会自己写注解?那有点危险了

来源:汇智坊编辑:数据库时间:2025-11-05 11:45:19

Java猿的听说命根子!

自Java EE框架步入Spring Boot时代之后,只会注解注解简直是用注Java程序员的命根子啊,面向注解编程成了日常操作!解不己写

换句话的点危意思就是说:如果没有注解,我们啥也干不了哇(滑稽)。听说

这岂不是只会注解很危险!

所以本文来唠一唠关于注解的用注相关操作,并自己动手来写一个注解感受一下原理。解不己写原理性的点危东西掌握了,心里自然就不慌了。听说

注解的只会注解基本原理

首先必须要说的是,注解它也不是用注什么高深的玩意儿,没必要畏惧它!解不己写

意如其名,点危其本来的意思就是用来做标注用:可以在类、字段变量、方法、接口等位置进行一个特殊的云南idc服务商标记,为后续做一些诸如:代码生成、数据校验、资源整合等工作做铺垫。

对嘛,就做标记用的嘛!

注解一旦对代码标注完成,后续我们就可以结合Java强大的反射机制,在运行时动态地获取到注解的标注信息,从而可以执行很多其他逻辑,完成我们想要的自动化工作。

所以,反射必须要学好!

来!动手造一个注解

在我的前文《听说你还在手写复杂的参数校验?》里曾经讲过, Spring自身提供了非常多好用的注解可以用来方便地帮我们做数据校验的工作。

比如,在没有注解加持时,我们想要校验 Student类:   

public class Student {          private Long id;        // 学号          private String name;    // 姓名          private String mobile;  // 手机号码(11位)      } 

我们只能通过手写 if判断来进行校验:

@PostMapping("/add")   public String addStudent( @RequestBody Student student ) {       if( student == null )           return "传入的Student对象为null,请传值";       if( student.getName()==null || "".equals(student.getName()) )           return "传入的学生姓名为空,请传值";       if( student.getScore()==null )           return "传入的学生成绩为null,请传值";       if( (student.getScore()<0) || (student.getScore()>100) )           return "传入的网站模板学生成绩有误,分数应该在0~100之间";       if( student.getMobile()==null || "".equals(student.getMobile()) )           return "传入的学生电话号码为空,请传值";       if( student.getMobile().length()!=11 )           return "传入的学生电话号码长度有误,应为11位";       studentService.addStudent( student ); // 将student对象存入MySQL数据库      return "SUCCESS";   } 

这样非常繁琐!

但是借助于 Spring提供的注解,数据校验工作可以变得非常优雅,就像这样:   

public class Student {         @NotNull(message = "传入的姓名为null,请传值")         @NotEmpty(message = "传入的姓名为空字符串,请传值")         private String name;    // 姓名         @NotNull(message = "传入的分数为null,请传值")         @Min(value = 0,message = "传入的学生成绩有误,分数应该在0~100之间")         @Max(value = 100,message = "传入的学生成绩有误,分数应该在0~100之间")         private Integer score;  // 分数         @NotNull(message = "传入的电话为null,请传值")         @NotEmpty(message = "传入的电话为空字符串,请传值")         @Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位")         private String mobile;  // 电话号码     } 

于是很多人就表示疑问,这些注解到底如何实现功能的呢?

今天本文则以上文的 @Length注解为例,自己动手实现一遍,这个学会了,源码下载其他注解实现原理也是类似。

总共分三大步实现。

第一步:首先定义注解:@Length

@Target({ElementType.FIELD})    @Retention(RetentionPolicy.RUNTIME)    public @interface Length {        int min();          // 允许字符串长度的最小值        int max();          // 允许字符串长度的最大值        String errorMsg();  // 自定义的错误提示信息    } 

下面做几点说明:

1、注解的定义有点像定义接口 interface,但唯一不同的是前面需要加一个 @符号

2、注解的成员变量只能使用基本类型、 String或者 enum枚举,比如 int可以,但 Integer这种包装类型就不行,需注意

3、像上面 @Target、 @Retention这种加在注解定义上面的注解,我们称为 “元注解”,元注解就是专门用于给注解添加注解的注解,哈哈,很拗口,简单理解,元注解就是天生就有的注解,可直接用于注解的定义上

4、 @Target(xxx) 用来说明该自定义注解可以用在什么位置,比如:

 ElementType.FIELD:说明自定义的注解可以用于类的变量  ElementType.METHOD:说明自定义的注解可以用于类的方法  ElementType.TYPE:说明自定义的注解可以用于类本身、接口或 enum类型  等等... 还有很多,如果记不住,建议现用现查

5、 @Retention(xxx) 用来说明你自定义注解的生命周期,比如:

 @Retention(RetentionPolicy.RUNTIME):表示注解可以一直保留到运行时,因此可以通过反射获取注解信息  @Retention(RetentionPolicy.CLASS):表示注解被编译器编译进 class文件,但运行时会忽略  @Retention(RetentionPolicy.SOURCE):表示注解仅在源文件中有效,编译时就会被忽略

所以声明周期从长到短分别为:RUNTIME > CLASS > SOURCE ,一般来说,如果需要在运行时去动态获取注解的信息,还是得用RUNTIME,就像本文所用。

第二步:获取注解并对其进行验证

在运行时想获取注解所代包含的信息,该怎么办?那当然得用 Java的反射相关知识!

下面写了一个验证函数 validate(),代码中会逐行用注释去解释想要达到的目的,认真看一下每一行的注释: 

public static String validate( Object object ) throws IllegalAccessException {        // 首先通过反射获取object对象的类有哪些字段       // 对本文来说就可以获取到Student类的id、name、mobile三个字段       Field[] fields = object.getClass().getDeclaredFields();       // for循环逐个字段校验,看哪个字段上标了注解       for( Field field : fields ) {           // if判断:检查该字段上有没有标注了@Length注解           if( field.isAnnotationPresent(Length.class) ) {               // 通过反射获取到该字段上标注的@Length注解的详细信息               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;   } 

可见,学好Java的反射知识是多么的重要!

第三步:使用注解

这一步比较轻松,使用注解的过程往往都是很愉悦的   

public class Student {         private Long id;        // 学号         private String name;    // 姓名         @Length(min = 11, max = 11, errorMsg = "电话号码的长度必须为11位")         private String mobile;  // 手机号码(11位)     } 

怎么样,其实一点也不复杂吧,主要就是反射相关的知识! 

上一篇:ubuntu打开网页视频后居然没有反应,找了半天解决方法才知道是没有安装adobeflash,那该如何安装呢?且看下面经验,希望对大家有用。因为ubuntu系统下面的默认浏览器是火狐,这里就以火狐为例,其实只要装了一个浏览器上的flash,那么就都可以了。第一步:打开火狐浏览器,并且在浏览器地址栏中输入一个地址,这个地址必须是在线视频播放的网站。然后随便点开一个视频,是不是提示你未安装flash呢?那么我们点击【这里】这个播放器上面的链接。假如你浏览器上,已经提示一个【install FLASH】的按钮,那么我们直接点击它也是可以的。按照第三步点开一个网页后,会弹出一个全英文的网页,我们看到网页右下角处的【Download now】按钮,点击它假如点不开,那么我们回到网页的左下角处,点击【select Version****】这个选项。在下拉列表中选着【APT FOR ubuntu】选项。之后,再去点击那个【Download now】按钮。开始下载。下载后,我们就可以安装这个软件了:1) 把下载的文件放进/home文件夹里面。2)按Ctrl+ALT+T调出终端,在终端中输入【sudu dpkg -i flash文件名】3)按enter执行后就开始安装,等待安装完成就可以啦。
下一篇:方法很简单,一条命令就搞定了:sudo apt-get install rar unrar系统会自动下载2个大约604K的包并安装,安装结束后就可以自由压缩/解压缩RAR文件了。

相关文章:

相关推荐:

0.5263s , 11785.1875 kb

Copyright © 2025 Powered by 听说你只会用注解,不会自己写注解?那有点危险了,汇智坊  滇ICP备2023006006号-2

sitemap

Top