2828import org .springframework .util .CollectionUtils ;
2929import 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 ;
3236import java .lang .reflect .Field ;
33- import java .lang .reflect .Method ;
3437import java .lang .reflect .ParameterizedType ;
3538import java .lang .reflect .Type ;
3639import 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
0 commit comments