成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發利器Hutool之MapProxy的妙用

開發 前端
目前公司項目中主要采用Hutool作為項目的工具包,相對于google的guava, hutool的工具類采用中文注釋,更加符合國人使用。所謂知己知彼,我們需要了解Hutool都具有什么樣的功能,才能夠最大化發揮它的價值。

概述

Hutool是一個小而全的Java工具類庫,通過靜態方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優雅,讓Java語言也可以“甜甜的”。

目前公司項目中主要采用Hutool作為項目的工具包,相對于google的guava, hutool的工具類采用中文注釋,更加符合國人使用。所謂知己知彼,我們需要了解Hutool都具有什么樣的功能,才能夠最大化發揮它的價值。

本文主要就hutool 5.8.8版本中MapProxy的使用。

場景引入

其實Map在get的時候是比較危險的,你可能不知道它是什么類型,需要進行強制,舉個例子如下:

@Test
public void testMapProxy1() {
Map<String, Object> userMap = MapUtil.newHashMap(16);
userMap.put("username", "alvin");
userMap.put("age", 20);

// 使用map的時候, 需要進行強轉,一旦類型錯誤,會報錯
String age = (String)userMap.get("age");
}

運行結果:

圖片

那有什么更好的解決方案嗎?Hutool提供了一種解決方案給我們。

MapProxy使用

依賴引入

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>

定義一個可訪問接口

interface MapUser {
String getUsername();

Integer getAge();

MapUser setAge(Integer age);
}

通過MapProxy訪問

@Test
public void testMapProxy2() {
Map<String, Object> userMap = MapUtil.newHashMap(16);
userMap.put("username", "alvin");
userMap.put("age", 20);

MapProxy mapProxy = MapProxy.create(userMap);
Integer age = mapProxy.getInt("age", 18);
Assert.assertTrue(age == 20);

// 通過代理的方式
MapUser mapUser = mapProxy.toProxyBean(MapUser.class);
// 后續訪問會變的更加安全
Assert.assertTrue(mapUser.getAge() == 20);

mapUser.setAge(30);
Assert.assertTrue(mapUser.getAge() == 30);
}

MapProxy源碼解析

Map代理,提供各種getXXX方法,并提供默認值支持,它的類結構圖如下:

圖片

  • 實現了OptNullBasicTypeFromObjectGetter接口, 提供了基本類型的get, 在不提供默認值的情況下, 如果值不存在或獲取錯誤,返回null, 比如:mapProxy.getInt("age", 18)
  • 實現了InvocationHandler接口,支持jdk的動態代理,生成代理對象。
public <T> T toProxyBean(Class<T> interfaceClass) {
return (T) Proxy.newProxyInstance(ClassLoaderUtil.getClassLoader(), new Class<?>[]{interfaceClass}, this);
}
  • toProxyBean方法就是生成代理對象,最終會調用代理類的invoke方法,這里的代理類就是MapProxy本身。
public Object invoke(Object proxy, Method method, Object[] args) {
final Class<?>[] parameterTypes = method.getParameterTypes();
// 如果調用方法參數為空
if (ArrayUtil.isEmpty(parameterTypes)) {
final Class<?> returnType = method.getReturnType();
// 方法返回值不是void
if (void.class != returnType) {
// 匹配Getter
final String methodName = method.getName();
String fieldName = null;
if (methodName.startsWith("get")) {
// 匹配getXXX
fieldName = StrUtil.removePreAndLowerFirst(methodName, 3);
} else if (BooleanUtil.isBoolean(returnType) && methodName.startsWith("is")) {
// 匹配isXXX
fieldName = StrUtil.removePreAndLowerFirst(methodName, 2);
}else if ("hashCode".equals(methodName)) {
return this.hashCode();
} else if ("toString".equals(methodName)) {
return this.toString();
}

if (StrUtil.isNotBlank(fieldName)) {
if (false == this.containsKey(fieldName)) {
// 駝峰不存在轉下劃線嘗試
fieldName = StrUtil.toUnderlineCase(fieldName);
}
return Convert.convert(method.getGenericReturnType(), this.get(fieldName));
}
}

// 如果方法參數不為空
} else if (1 == parameterTypes.length) {
// 匹配Setter
final String methodName = method.getName();
if (methodName.startsWith("set")) {
final String fieldName = StrUtil.removePreAndLowerFirst(methodName, 3);
if (StrUtil.isNotBlank(fieldName)) {
this.put(fieldName, args[0]);
final Class<?> returnType = method.getReturnType();
// 判斷返回類型是不是代理類的實例
if(returnType.isInstance(proxy)){
return proxy;
}
}
} else if ("equals".equals(methodName)) {
return this.equals(args[0]);
}
}

throw new UnsupportedOperationException(method.toGenericString());
}

總結

本文主要講解了Hutool中的MapProxy類的使用,希望對大家有幫助。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2019-10-18 16:05:32

框架開發Java

2022-09-21 08:16:18

緩存框架

2024-03-19 07:00:00

C++編程pragma

2022-10-26 09:57:52

VectorRustC++

2018-11-26 07:04:59

神經網絡優化函數

2023-07-19 12:24:48

C++constexpr?語句

2023-10-16 16:05:44

PythonPyCharm編程語言

2021-09-02 07:04:44

Go 開發利器

2010-03-10 17:57:54

Python編程語言

2012-06-25 17:21:15

天天記事

2011-11-14 09:17:14

Linux運維ClusterShel

2024-03-05 10:41:51

Rollup前端開發

2024-03-22 09:45:34

大型語言模型Unity引擎游戲開發

2024-04-25 08:22:43

AndroidlargeHeap屬性

2021-12-09 06:59:24

FlinkSQL 開發

2021-08-30 10:19:05

PyFlink 開發環境Zeppelin No

2023-09-28 21:39:26

HutoolJava工具包

2010-09-08 16:26:26

SQL循環語句

2023-08-01 09:46:57

虛擬鍵盤API

2023-11-27 19:35:01

C++extern
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久九九色 | 国产性生活一级片 | 成人久久久 | 国产精品午夜电影 | 野狼在线社区2017入口 | 人妖videosex高潮另类 | 久久福利| 国产一区二区三区四区在线观看 | 国产成人午夜高潮毛片 | 玖玖在线精品 | 亚洲精品久久久久国产 | 日本亚洲欧美 | 一区二区成人在线 | 久久久久久精 | 一区二区日韩 | 国产精品成人一区二区三区 | 日韩一区二区三区在线 | 亚洲欧美一区二区三区国产精品 | 久久大香 | 91精品国产一区二区三区蜜臀 | 亚洲欧美中文日韩在线v日本 | 日韩中文字幕在线视频观看 | 2021天天躁夜夜看 | jav成人av免费播放 | 第一区在线观看免费国语入口 | 一区二区三区免费网站 | 精品国产欧美一区二区 | 欧美亚洲在线视频 | 亚洲成人黄色 | 区一区二区三在线观看 | 成人影院一区二区三区 | 久久久久久av | 国产亚洲欧美日韩精品一区二区三区 | 夜夜夜夜夜夜曰天天天 | 一级片av| 午夜爽爽爽男女免费观看影院 | 国产成人一区二区三区 | 精品欧美一区二区精品久久久 | 激情毛片 | 中文字幕av网 | 天天操天天射天天舔 |