看似很雞肋其實(shí)在某些特殊場(chǎng)景還是比較有用的。
比如你將實(shí)體類轉(zhuǎn)Map或者拿到一個(gè)Map結(jié)果的時(shí)候,你是怎么獲取某個(gè)map的key和value。
方法一:
聲明 String key1="aaa"; key為 key1,value 為map.get(key1);
1
2
3
4
5
6
7
8
|
Map<String,Object> map= new HashMap<>(); map.put( "aaa" , 1 ); //獲取map的key 和value //key 為key1 String key1= "aaa" ; //value 為 map.get(key1) map.get(key1); |
然后好像日常使用中也沒有其他的方法了,下面將帶來(lái)另外一種使用方法,話不多說直接上代碼[/code]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
import java.io.Serializable; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.function.Function; /** * Java8通過Function函數(shù)獲取字段名稱(獲取實(shí)體類的字段名稱) * @see ColumnUtil#main(java.lang.String[]) 使用示例 * @author jx */ public class ColumnUtil { /** * 使Function獲取序列化能力 */ @FunctionalInterface public interface SFunction<T, R> extends Function<T, R>, Serializable { } /** * 字段名注解,聲明表字段 */ @Target (ElementType.FIELD) @Retention (RetentionPolicy.RUNTIME) public @interface TableField { String value() default "" ; } //默認(rèn)配置 static String defaultSplit = "" ; static Integer defaultToType = 0 ; /** * 獲取實(shí)體類的字段名稱(實(shí)體聲明的字段名稱) */ public static <T> String getFieldName(SFunction<T, ?> fn) { return getFieldName(fn, defaultSplit); } /** * 獲取實(shí)體類的字段名稱 * @param split 分隔符,多個(gè)字母自定義分隔符 */ public static <T> String getFieldName(SFunction<T, ?> fn, String split) { return getFieldName(fn, split, defaultToType); } /** * 獲取實(shí)體類的字段名稱 * @param split 分隔符,多個(gè)字母自定義分隔符 * @param toType 轉(zhuǎn)換方式,多個(gè)字母以大小寫方式返回 0.不做轉(zhuǎn)換 1.大寫 2.小寫 */ public static <T> String getFieldName(SFunction<T, ?> fn, String split, Integer toType) { SerializedLambda serializedLambda = getSerializedLambda(fn); // 從lambda信息取出method、field、class等 String fieldName = serializedLambda.getImplMethodName().substring( "get" .length()); fieldName = fieldName.replaceFirst(fieldName.charAt( 0 ) + "" , (fieldName.charAt( 0 ) + "" ).toLowerCase()); Field field; try { field = Class.forName(serializedLambda.getImplClass().replace( "/" , "." )).getDeclaredField(fieldName); } catch (ClassNotFoundException | NoSuchFieldException e) { throw new RuntimeException(e); } // 從field取出字段名,可以根據(jù)實(shí)際情況調(diào)整 TableField tableField = field.getAnnotation(TableField. class ); if (tableField != null && tableField.value().length() > 0 ) { return tableField.value(); } else { //0.不做轉(zhuǎn)換 1.大寫 2.小寫 switch (toType) { case 1 : return fieldName.replaceAll( "[A-Z]" , split + "$0" ).toUpperCase(); case 2 : return fieldName.replaceAll( "[A-Z]" , split + "$0" ).toLowerCase(); default : return fieldName.replaceAll( "[A-Z]" , split + "$0" ); } } } private static <T> SerializedLambda getSerializedLambda(SFunction<T, ?> fn) { // 從function取出序列化方法 Method writeReplaceMethod; try { writeReplaceMethod = fn.getClass().getDeclaredMethod( "writeReplace" ); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } // 從序列化方法取出序列化的lambda信息 boolean isAccessible = writeReplaceMethod.isAccessible(); writeReplaceMethod.setAccessible( true ); SerializedLambda serializedLambda; try { serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } writeReplaceMethod.setAccessible(isAccessible); return serializedLambda; } /** * 測(cè)試用戶實(shí)體類 */ public static class TestUserDemo implements Serializable { private static final long serialVersionUID = 1L; private String loginName; private String name; private String companySimpleName; @ColumnUtil .TableField( "nick" ) private String nickName; public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this .loginName = loginName; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this .nickName = nickName; } public static long getSerialVersionUID() { return serialVersionUID; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getCompanySimpleName() { return companySimpleName; } public void setCompanySimpleName(String companySimpleName) { this .companySimpleName = companySimpleName; } } /** * 參考示例 */ public static void main(String[] args) { //實(shí)體類原字段名稱返回 System.out.println(); System.out.println( "實(shí)體類原字段名稱返回" ); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getLoginName)); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getNickName)); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName)); System.out.println(); System.out.println( "實(shí)體類字段名稱增加分隔符" ); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_" )); System.out.println(); System.out.println( "實(shí)體類字段名稱增加分隔符 + 大小寫" ); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_" , 0 )); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_" , 1 )); System.out.println( "字段名:" + ColumnUtil.getFieldName(TestUserDemo::getCompanySimpleName, "_" , 2 )); } } |
輸出結(jié)果:
到此這篇關(guān)于Java8通過Function獲取字段名(獲取實(shí)體類的字段名稱)的文章就介紹到這了,更多相關(guān)Java8通過Function獲取字段名內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/IT-study/p/15351980.html