Skip to content

Commit 0ee39b8

Browse files
committed
Method substituted by MethodHandle
1 parent 1595320 commit 0ee39b8

File tree

23 files changed

+571
-469
lines changed

23 files changed

+571
-469
lines changed

common/src/main/java/com/robin/comm/util/redis/JedisClientFactory.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import javax.annotation.concurrent.ThreadSafe;
1818
import java.io.*;
19+
import java.lang.invoke.MethodHandle;
1920
import java.lang.reflect.Method;
2021
import java.util.*;
2122

@@ -151,17 +152,17 @@ public void putPlainSet(String key, String... value) {
151152

152153
public byte[] putSetWithSchema(Schema schema, Schema nestedSchema, List<? extends Serializable> valueObject) throws Exception {
153154
Assert.notEmpty(valueObject, "array is null");
154-
Map<String, Method> getMethods = ReflectUtils.returnGetMethods(valueObject.get(0).getClass());
155+
Map<String, MethodHandle> getMethods = ReflectUtils.returnGetMethodHandle(valueObject.get(0).getClass());
155156

156157
try {
157158
GenericRecord rd = new GenericData.Record(nestedSchema);
158159
List<GenericRecord> retList = new ArrayList<>();
159160
for (Serializable obj : valueObject) {
160161
GenericRecord genericRecord = new GenericData.Record(schema);
161-
Iterator<Map.Entry<String, Method>> iter = getMethods.entrySet().iterator();
162+
Iterator<Map.Entry<String, MethodHandle>> iter = getMethods.entrySet().iterator();
162163
while (iter.hasNext()) {
163-
Map.Entry<String, Method> entry = iter.next();
164-
genericRecord.put(entry.getKey(), AvroUtils.acquireGenericRecord(entry.getKey(), entry.getValue().invoke(obj, null), schema));
164+
Map.Entry<String, MethodHandle> entry = iter.next();
165+
genericRecord.put(entry.getKey(), AvroUtils.acquireGenericRecord(entry.getKey(), entry.getValue().bindTo(obj).invoke(), schema));
165166
}
166167
retList.add(genericRecord);
167168
}
@@ -174,8 +175,8 @@ public byte[] putSetWithSchema(Schema schema, Schema nestedSchema, List<? extend
174175
System.out.println(record);
175176
return bytes;
176177
//getJedis().sadd(key.getBytes(),AvroUtils.dataToByteWithBijection(nestedSchema,))
177-
} catch (Exception ex) {
178-
throw ex;
178+
} catch (Throwable ex) {
179+
throw new IllegalAccessException(ex.getMessage());
179180
}
180181
}
181182

common/src/main/java/com/robin/core/fileaccess/util/AvroUtils.java

Lines changed: 56 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@
2828
import org.springframework.util.CollectionUtils;
2929
import org.springframework.util.ObjectUtils;
3030

31-
import java.io.*;
31+
import java.io.ByteArrayInputStream;
32+
import java.io.ByteArrayOutputStream;
33+
import java.io.IOException;
34+
import java.io.Serializable;
35+
import java.lang.invoke.MethodHandle;
3236
import java.lang.reflect.Field;
33-
import java.lang.reflect.Method;
3437
import java.lang.reflect.ParameterizedType;
3538
import java.lang.reflect.Type;
3639
import java.nio.file.Files;
@@ -200,15 +203,15 @@ public static void byteToObject(Schema schema, byte[] bytes, Object valueObj, Cl
200203
List list = (List) valueObj;
201204
if (!CollectionUtils.isEmpty(list)) {
202205
Class<?> targetClazz = list.get(0).getClass();
203-
Map<String, Method> setMap = ReflectUtils.returnSetMethods(targetClazz);
206+
Map<String, MethodHandle> setMap = ReflectUtils.returnSetMethodHandle(targetClazz);
204207
if (grecord.getSchema().getType().equals(Schema.Type.ARRAY)) {
205208
List<GenericRecord> flist = (List<GenericRecord>) grecord.get(0);
206209
for (GenericRecord g : flist) {
207210
Object t = targetClazz.newInstance();
208-
for (Map.Entry<String, Method> entry : setMap.entrySet()) {
211+
for (Map.Entry<String, MethodHandle> entry : setMap.entrySet()) {
209212
if (g.get(entry.getKey()) != null) {
210213
Schema eleType = schema.getField(entry.getKey()).schema().getTypes().get(0).getElementType();
211-
entry.getValue().invoke(t, acquireGenericRecord(entry.getKey(), g.get(entry.getKey()), eleType));
214+
entry.getValue().bindTo(t).invoke(acquireGenericRecord(entry.getKey(), g.get(entry.getKey()), eleType));
212215
}
213216
}
214217
list.add(t);
@@ -230,8 +233,8 @@ public static void byteToObject(Schema schema, byte[] bytes, Object valueObj, Cl
230233
} else if (valueObj.getClass().isAssignableFrom(Serializable.class)) {
231234
acquireModel(grecord, valueObj);
232235
}
233-
} catch (Exception ex) {
234-
236+
} catch (Throwable ex) {
237+
throw new IOException(ex.getMessage());
235238
}
236239
}
237240

@@ -244,12 +247,12 @@ public static Object acquireGenericRecord(String key, Object value, Schema schem
244247
if (CollectionUtils.isEmpty(list)) {
245248
return null;
246249
}
247-
Map<String, Method> getMethods = ReflectUtils.returnGetMethods(list.get(0).getClass());
250+
Map<String, MethodHandle> getMethods = ReflectUtils.returnGetMethodHandle(list.get(0).getClass());
248251
Schema eleType = schema.getField(key).schema().getTypes().get(0).getElementType();
249252
for (Object t : list) {
250253
GenericRecord grecord = new GenericData.Record(eleType);
251-
for (Map.Entry<String, Method> entry : getMethods.entrySet()) {
252-
grecord.put(entry.getKey(), acquireGenericRecord(entry.getKey(), entry.getValue().invoke(t, null), eleType));
254+
for (Map.Entry<String, MethodHandle> entry : getMethods.entrySet()) {
255+
grecord.put(entry.getKey(), acquireGenericRecord(entry.getKey(), entry.getValue().bindTo(value).invoke(), eleType));
253256
}
254257
records.add(grecord);
255258
}
@@ -284,67 +287,66 @@ public static Object acquireGenericRecord(String key, Object value, Schema schem
284287
return value;
285288
} else {
286289
GenericRecord record = new GenericData.Record(schema);
287-
Map<String, Method> getMethods = ReflectUtils.returnGetMethods(value.getClass());
288-
for (Map.Entry<String, Method> entry : getMethods.entrySet()) {
290+
Map<String, MethodHandle> getMethods = ReflectUtils.returnGetMethodHandle(value.getClass());
291+
for (Map.Entry<String, MethodHandle> entry : getMethods.entrySet()) {
289292
if (schema.getField(entry.getKey()) != null) {
290-
record.put(entry.getKey(), acquireGenericRecord(entry.getKey(), entry.getValue().invoke(value, null), schema.getField(entry.getKey()).schema()));
293+
record.put(entry.getKey(), acquireGenericRecord(entry.getKey(), entry.getValue().bindTo(value).invoke(), schema.getField(entry.getKey()).schema()));
291294
}
292295
}
293296
return record;
294297
}
295298
}
296-
} catch (Exception ex) {
299+
} catch (Throwable ex) {
297300
ex.printStackTrace();
298301
}
299302
return null;
300303
}
301304

302305
public static void acquireModel(GenericRecord genericRecord, Object targetObj) throws Exception {
303306
List<Schema.Field> fields = genericRecord.getSchema().getFields();
304-
Map<String, Method> setMap = ReflectUtils.returnSetMethods(targetObj.getClass());
305-
for (Schema.Field field : fields) {
306-
307-
if ((field.schema().getType().equals(Schema.Type.UNION) && field.schema().getTypes().get(0).getType().equals(Schema.Type.LONG)) || field.schema().getType().equals(Schema.Type.LONG)) {
308-
Long val = (Long) genericRecord.get(field.name());
309-
if (setMap.get(field.name()).getParameterTypes()[0].isAssignableFrom(Date.class)) {
310-
setMap.get(field.name()).invoke(targetObj, new Date(val));
311-
} else if (setMap.get(field.name()).getParameterTypes()[0].isAssignableFrom(Timestamp.class)) {
312-
setMap.get(field.name()).invoke(targetObj, new Timestamp(val));
313-
} else if (setMap.get(field.name()).getParameterTypes()[0].isAssignableFrom(LocalDateTime.class)) {
314-
setMap.get(field.name()).invoke(targetObj, LocalDateTime.ofInstant(Instant.ofEpochMilli(val), ZoneId.systemDefault()));
315-
} else if (setMap.get(field.name()).getParameterTypes()[0].isAssignableFrom(Long.class)) {
316-
setMap.get(field.name()).invoke(targetObj, val);
317-
}
318-
} else if (field.schema().getType().equals(Schema.Type.RECORD)) {
319-
Object vobj = setMap.get(field.name()).getParameterTypes()[0].newInstance();
320-
acquireModel((GenericRecord) genericRecord.get(field.name()), vobj);
321-
setMap.get(field.name()).invoke(targetObj, vobj);
322-
} else if (field.schema().getTypes().get(0).getType().equals(Schema.Type.MAP)) {
323-
Type[] genericClazzs = ((ParameterizedType) setMap.get(field.name()).getGenericParameterTypes()[0]).getActualTypeArguments();
324-
/*if (!genericClazzs[1].getTypeName().endsWith(".Object")) {
325-
326-
} else {
327-
328-
}*/
329-
} else if (!ObjectUtils.isEmpty(field.schema().getTypes()) && field.schema().getTypes().get(0).getType().equals(Schema.Type.ARRAY)) {
330-
Type genericClazz = ((ParameterizedType) setMap.get(field.name()).getGenericParameterTypes()[0]).getActualTypeArguments()[0];
331-
List<Object> list = new ArrayList<>();
332-
List<GenericRecord> records = (List<GenericRecord>) genericRecord.get(field.name());
333-
if (!CollectionUtils.isEmpty(records)) {
334-
for (GenericRecord rec : records) {
335-
Object vobj = Class.forName(genericClazz.getTypeName()).newInstance();
336-
acquireModel(rec, vobj);
337-
list.add(vobj);
307+
Map<String, MethodHandle> setMap = ReflectUtils.returnSetMethodHandle(targetObj.getClass());
308+
try {
309+
for (Schema.Field field : fields) {
310+
if ((field.schema().getType().equals(Schema.Type.UNION) && field.schema().getTypes().get(0).getType().equals(Schema.Type.LONG)) || field.schema().getType().equals(Schema.Type.LONG)) {
311+
Long val = (Long) genericRecord.get(field.name());
312+
Class<?> type = setMap.get(field.name()).type().parameterType(1);
313+
if (type.isAssignableFrom(Date.class)) {
314+
setMap.get(field.name()).bindTo(targetObj).invoke(new Date(val));
315+
} else if (type.isAssignableFrom(Timestamp.class)) {
316+
setMap.get(field.name()).bindTo(targetObj).invoke(new Timestamp(val));
317+
} else if (type.isAssignableFrom(LocalDateTime.class)) {
318+
setMap.get(field.name()).bindTo(targetObj).invoke(LocalDateTime.ofInstant(Instant.ofEpochMilli(val), ZoneId.systemDefault()));
319+
} else if (type.isAssignableFrom(Long.class)) {
320+
setMap.get(field.name()).bindTo(targetObj).invoke(val);
338321
}
339-
}
340-
setMap.get(field.name()).invoke(targetObj, list);
341-
} else {
342-
if (field.schema().getTypes().get(0).getType().equals(Schema.Type.STRING)) {
343-
setMap.get(field.name()).invoke(targetObj, genericRecord.get(field.name()).toString());
322+
} else if (field.schema().getType().equals(Schema.Type.RECORD)) {
323+
Object vobj = setMap.get(field.name()).type().parameterType(1).newInstance();
324+
acquireModel((GenericRecord) genericRecord.get(field.name()), vobj);
325+
setMap.get(field.name()).bindTo(targetObj).invoke(vobj);
326+
} else if (field.schema().getTypes().get(0).getType().equals(Schema.Type.MAP)) {
327+
328+
} else if (!ObjectUtils.isEmpty(field.schema().getTypes()) && field.schema().getTypes().get(0).getType().equals(Schema.Type.ARRAY)) {
329+
Type genericClazz = setMap.get(field.name()).type().parameterType(1).getGenericSuperclass();
330+
List<Object> list = new ArrayList<>();
331+
List<GenericRecord> records = (List<GenericRecord>) genericRecord.get(field.name());
332+
if (!CollectionUtils.isEmpty(records)) {
333+
for (GenericRecord rec : records) {
334+
Object vobj = Class.forName(genericClazz.getTypeName()).newInstance();
335+
acquireModel(rec, vobj);
336+
list.add(vobj);
337+
}
338+
}
339+
setMap.get(field.name()).bindTo(targetObj).invoke(list);
344340
} else {
345-
setMap.get(field.name()).invoke(targetObj, genericRecord.get(field.name()));
341+
if (field.schema().getTypes().get(0).getType().equals(Schema.Type.STRING)) {
342+
setMap.get(field.name()).bindTo(targetObj).invoke(genericRecord.get(field.name()).toString());
343+
} else {
344+
setMap.get(field.name()).bindTo(targetObj).invoke(genericRecord.get(field.name()));
345+
}
346346
}
347347
}
348+
}catch (Throwable ex1){
349+
throw new IllegalAccessException(ex1.getMessage());
348350
}
349351
}
350352

core/src/main/java/com/robin/core/base/dao/CommJdbcUtil.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springframework.util.CollectionUtils;
4040
import org.springframework.util.ObjectUtils;
4141

42+
import java.lang.invoke.MethodHandle;
4243
import java.lang.reflect.Method;
4344
import java.sql.Date;
4445
import java.sql.*;
@@ -361,16 +362,18 @@ static void setTargetValue(Object target, Object value, String columnName, Strin
361362
if (target instanceof HashMap) {
362363
((HashMap) target).put(columnName, targetValue);
363364
} else {
364-
Map<String, Method> setMethods = ReflectUtils.returnSetMethods(target.getClass());
365+
Map<String, MethodHandle> setMethods = ReflectUtils.returnSetMethodHandle(target.getClass());
365366
if (setMethods.containsKey(columnName)) {
366-
setMethods.get(columnName).invoke(target, targetValue);
367+
setMethods.get(columnName).bindTo(target).invoke(targetValue);
367368
}
368369
}
369370
}
370371
} catch (DAOException ex) {
371372
throw ex;
372373
} catch (Exception ex) {
373374
throw new DAOException(ex);
375+
}catch (Throwable ex2){
376+
throw new DAOException(ex2.getMessage());
374377
}
375378
}
376379

0 commit comments

Comments
 (0)