Hutool 中 @alias 注解的使用及原理

1,210 阅读2分钟

Hi,我是松柏。

对于 Hutool,Java 开发应该都不陌生,非常简单易用的一个工具包,我自己在开发中像发送网络请求、字符串、集合操作也是很经常用到,今天要说的内容就跟其中的对象转 json 工具类有关。

事情是这样的,我需要对接一个三方的 API,这个 API 接收的请求参数大概是这样的:

{
  "file_url": "xxx"
  "file_name": "xxx"
}

那我在使用的时候,就会定义一个对应的实体类来处理,像这样:

@Data
public class RequestParam {
    private String fileUrl;
    private String fileName;
}

然后通过工具类把请求发出去:

public static void main(String[] args) {
    String requestParam = JSONUtil.toJsonStr(new RequestParam());
    String responseBody = HttpUtil.post("xxx.com", requestParam);
}

不出意外,这个请求就要失败了,因为这个 API 接收的参数命名是下划线格式,而我们的请求参数里是驼峰格式,那怎么办呢?

最简单的方法,把实体类的命名改成下划线格式不就行了。

但是这样并不符合 Java 的命名规范,不那么优雅,而且这种问题一般工具类会有相应的处理措施,于是我来到了官方文档,果然找到了相关内容:@alias 注解,那我们就来试下他的效果:

@Data
public class RequestParam {
    @Alias("file_url")
    private String fileUrl;
    @Alias("file_name")
    private String fileName;
    public static void main(String[] args) {
        RequestParam requestParam1 = new RequestParam();
        requestParam1.setFileUrl("111");
        requestParam1.setFileUrl("222");
        String requestParam = JSONUtil.toJsonStr(new RequestParam());
        System.out.println(requestParam);
    }
}

// 输出
{"file_url":"111","file_name":"222"}

ok,这样处理之后就没问题了。

到这里应用层面的内容就结束了,我们已经知道了这种情况应该怎么做,但是为什么我们这么做就可以了呢?

其实原理非常的简单,我们一起来看下。

我在调试的时候,第一反应是点进去看一眼不就好了?然而现实很骨感,这一层一层的方法堆栈不知道得看到啥时候。

然后突然想到,我直接看看 @Alias 在哪里使用过不就完事了?说干就干,然后我打开 idea 的全局搜索(记得选中 Scope 并选择 All Places):

一眼看见只有一个源码文件中使用到了这个注解,让调试难度直接下降了 n 倍,点进去更兴奋了,因为只有一个方法用到了它,那肯定没跑了:

好嘞,在这打个断点来看一眼,运行:

果不其然,就是在这个方法通过反射拿到注解,然后通过注解的 value 属性值完成了 key 的替换。

通过这么一个简单的例子,希望能帮助大家熟悉 @alias 注解的使用,也能了解一些 debug 的技巧。

欢迎关注公众号 co松柏 获取联系方式学习交流,有帮助的话欢迎点个赞,拜拜!