悟红尘:​zhuanlan.zhihu.com

在我们的项目中和后台的通信的时候,为了防止别人截获并篡改信息,于是决定启用一套自己验签规则,那就是将所有属性的值拼接起来进行SHA256签名,在这个字符串拼接的时候如果属性少还好,直接写一个方法将属性值拼接起来就好了,但是如果属性很多的话,并且需要多次不同的数据与后台进行交互,每次写个方法拼接太麻烦了,为了造福后来者,使拼接变得简单,所以用注解进行了优化。

注解是的作用是在类或者方法,属性等上面打上一个标签,然后通过java的反射机制动态的对打上标签的内容进行解析和处理。

在Java中已经内置了几个注解,我们平常可能有看到:

@Override 用在方法上,表示要覆盖父类中的方法

@Deprecated 表示被弃用的代码,如果使用了被他标注的方法会提示警告

@SuppressWarnings,关闭不当编译器警告信息。

我们可以使用元注解自定义自己的注解,首先需要明白什么是元注解,元注解是java中用于标示注解的注解,java中元注解分为:@Retention、 @Target、 @Document、 @Inherited和@Repeatable

@Retention

标示的是注解存留的阶段,有一个枚举类:

RetentionPolicy.SOURCE 仅存于源码中

RetentionPolicy.CLASS 存在于字节码中,但是在运行是无法获得

RetentionPolicy.RUNTIME 在运行是可以通过反射获得,前面也说过注解的目的是通过反射机制动态的获取值,那么我们最常用的那肯定就是这个了

@Target

目标的意思,是说我们制定的注解是用于什么地方,比如方法,属性,还是类等,同样有一个枚举:

ElementType.TYPE 表示可以作用于类,方法,枚举

ElementType.FIELD 作用于属性

ElementType.METHOD 作用于方法

。。。还有其他的就不说了,反正也不常用,用的时候再看吧

@Documented

它的意思是文档,作用是能将注解包含的Javadoc中去,其实要是用工具javadoc生成文档的时候用,不需要搞什么文档的话,加不加没啥区别

@Inherited

继承的意思,就是子类如果没有其他别的注解的话,可以继承父类标注的注解

@Repeatable

Repeatable的英文意思是可重复的。顾名思义说明被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

好了,那下面我们说说我们最上面说的签名的优化,首先定义注解:

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface ValidateValue {

//是否参与验证

boolean isValidate() default false;

//排序值

int sortValue() default 0;

}

接着利用反射,根据顺序拼接字符串:

public static String getValue(Object object){

Class aClass = object.getClass();

//获取所有声明的属性

Field[] declaredFields = aClass.getDeclaredFields();

//过滤出所有带有注解的属性

List fields = new ArrayList<>();

for (Field field : declaredFields){

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

ValidateValue annotation = field.getAnnotation(ValidateValue.class);

if(annotation.isValidate()){

fields.add(field);

}

}

}

//根据定义的顺序排序

Collections.sort(fields, (o1, o2) -> {

ValidateValue annotation1 = o1.getAnnotation(ValidateValue.class);

ValidateValue annotation2 = o2.getAnnotation(ValidateValue.class);

return annotation1.sortValue() - annotation2.sortValue();

});

StringBuilder sb = new StringBuilder();

for (Field field : fields){

field.setAccessible(true);

try {

//获取属性的值,因为都是基本类型,并且拼的是字符串,所以不用判断获得值是什么类型,直接用object即可

Object value = field.get(object);

sb.append(value);

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

return sb.toString();

}

好了 我们测试下,先定义个bean:

public class Student {

@ValidateValue(isValidate = true, sortValue = 0)

private String address;

@ValidateValue(isValidate = true, sortValue = 2)

private String name;

@ValidateValue(isValidate = true, sortValue = 1)

private String sex;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

public static void main(String[] args) {

Student student = new Student();

student.setAge(100);

student.setName("小明");

student.setSex("男");

student.setAddress("上海");

System.out.println(getValue(student));

}

结果是: 上海男小明

因为地址的sort为0,sex的sort为1,那么的sort为2

OK 完成

java 封装优化工具_利用Java注解的简单封装的一次优化相关推荐

  1. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  2. java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

    java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...

  3. java界面设计股票_利用JAVA实现股票交易系统设计参考.doc

    利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...

  4. java反序列化终极工具_检测java反序列化漏洞

    java反序列化终极测试工具是一款检测java反序列化漏洞工具,直接将Jboss.Websphere和weblogic的反序列化漏洞的利用集成到了一起.java反序列化漏洞已经被曝出一段时间了,其强大 ...

  5. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  6. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

  7. java 获取文件名长度_利用Java文件类File的方法,获取磁盘文件的文件名、长度、大小等特性...

    利用Java文件类File的方法,获取磁盘文件的文件名.长度.大小等特性. 如题,大神们谁可以编写一个这样的java程序?     happy530755 | 浏览 1482 次 |举报 我 ...

  8. java简易画图工具_求Java简单画图工具

    展开全部 ///保存一个pb.java文件直接编译执e68a8462616964757a686964616f31333262363631行 import java.applet.*; import j ...

  9. java日期相差周_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

最新文章

  1. 从电影《蝴蝶效应》中学习回溯算法的核心思想
  2. CSS中的盒子阴影和文字阴影
  3. Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四)
  4. linux 终端 含义,ubuntu终端中@前后的字符串含义及修改-布布扣-bubuko.com
  5. python request-Python之request模块-基础用法
  6. 【jzoj】2018/2/2 NOIP普及组——D组模拟赛
  7. java围棋毕业设计_(毕业论文)围棋游戏的设计与实现.doc
  8. 天合光能环卫机器人_无人驾驶已在南京多个领域落地!无人环卫,离全面落地还有多久...
  9. CNET:乔布斯留给我们的12条宝贵经验
  10. 在sqlyog中创建MySQL触发器简单实例
  11. HBase中MVCC的实现机制及应用情况
  12. shell脚本语言和java_shell脚本学习与总结
  13. UnboundLocalError: local variable 'XXX' referenced before assignment
  14. linux把程序放入后台执行,linux将程序放到后台执行
  15. 3D语义场景图论文小记
  16. Android微信支付集成流程及其常见错误
  17. 区块链经济:机构加密经济学的初学者指南
  18. php处理微信weui图片上传
  19. JsonFormat使用经历
  20. Bode Plots by Hand 徒手绘制波特图

热门文章

  1. nginx搭建文件服务器脚本,nginx搭建web服务器,配置端口复用
  2. 几种添加系统环境变量方法和区别
  3. 启明云端分享:产品应用上,怎么选型ESP-12F\ESP-12E\ESP-12S\ESP-07S这四个模块
  4. python discuz搜索api_Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
  5. python测试udp端口_Linux系统的ECS实例中TCP/UDP端口测试及验证方法说明
  6. smarty能创建 php页面,smarty 生成静态html页面
  7. 超过200m文件发送_微信支持发送大文件了,高清视频不再压缩
  8. echarts symbol 回调函数_凹函数和凸函数到底什么样?傻傻分不清楚
  9. kafka 名词解释及原理解析过程(三)
  10. oracle里的查询转换