8000 vpack: reflection shifted · anderick/arangodb-java-driver@4418cbc · GitHub
[go: up one dir, main page]

Skip to content

Commit 4418cbc

Browse files
author
Mark
committed
vpack: reflection shifted
1 parent 46ed9a2 commit 4418cbc

File tree

2 files changed

+38
-28
lines changed

2 files changed

+38
-28
lines changed

src/main/java/com/arangodb/velocypack/VPack.java

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.arangodb.velocypack;
22

33
import java.lang.reflect.Array;
4-
import java.lang.reflect.Field;
54
import java.lang.reflect.InvocationTargetException;
65
import java.math.BigDecimal;
76
import java.math.BigInteger;
@@ -212,9 +211,8 @@ private void deserializeField(final VPackSlice vpack, final Object entity, final
212211
VPackException {
213212
final VPackSlice attr = new VPackSlice(vpack.getVpack(), vpack.getStart() + vpack.getByteSize());
214213
if (!attr.isNone()) {
215-
final Field field = fieldInfo.getField();
216-
final Object value = getValue(attr, field.getType(), fieldInfo);
217-
field.set(entity, value);
214+
final Object value = getValue(attr, fieldInfo.getType(), fieldInfo);
215+
fieldInfo.set(entity, value);
218216
}
219217
}
220218

@@ -366,14 +364,12 @@ private void serializeField(final Object entity, final VPackBuilder builder, fin
366364
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, VPackException {
367365

368366
final String fieldName = fieldInfo.getFieldName();
369-
final Field field = fieldInfo.getField();
370-
final Class<?> type = field.getType();
371-
final Object value = field.get(entity);
372-
addValue(field, fieldName, type, value, builder, fieldInfo);
367+
final Class<?> type = fieldInfo.getType();
368+
final Object value = fieldInfo.get(entity);
369+
addValue(fieldName, type, value, builder, fieldInfo);
373370
}
374371

375372
private void addValue(
376-
final Field field,
377373
final String name,
378374
final Class<?> type,
379375
final Object value,
@@ -394,7 +390,7 @@ private void addValue(
394390
} else if (Iterable.class.isAssignableFrom(type)) {
395391
serializeIterable(name, value, builder);
396392
} else if (Map.class.isAssignableFrom(type)) {
397-
serializeMap(name, type, value, builder, fieldInfo);
393+
serializeMap(name, value, builder, fieldInfo);
398394
} else {
399395
serializeObject(name, value, builder);
400396
}
@@ -407,7 +403,7 @@ private void serializeArray(final String name, final Object value, final VPackBu
407403
builder.add(name, new Value(ValueType.ARRAY));
408404
for (int i = 0; i < Array.getLength(value); i++) {
409405
final Object element = Array.get(value, i);
410-
addValue(null, null, element.getClass(), element, builder, null);
406+
addValue(null, element.getClass(), element, builder, null);
411407
}
412408
builder.close();
413409
}
@@ -417,14 +413,13 @@ private void serializeIterable(final String name, final Object value, final VPac
417413
builder.add(name, new Value(ValueType.ARRAY));
418414
for (final Iterator iterator = Iterable.class.cast(value).iterator(); iterator.hasNext();) {
419415
final Object element = iterator.next();
420-
addValue(null, null, element.getClass(), element, builder, null);
416+
addValue(null, element.getClass(), element, builder, null);
421417
}
422418
builder.close();
423419
}
424420

425421
private void serializeMap(
426422
final String name,
427-
final Class<?> type,
428423
final Object value,
429424
final VPackBuilder builder,
430425
final FieldInfo fieldInfo)
@@ -436,17 +431,16 @@ private void serializeMap(
436431
builder.add(name, new Value(ValueType.OBJECT));
437432
final Set<Entry<?, ?>> entrySet = map.entrySet();
438433
for (final Entry<?, ?> entry : entrySet) {
439-
addValue(null, keyToString(entry.getKey()), entry.getValue().getClass(), entry.getValue(), builder,
440-
null);
434+
addValue(keyToString(entry.getKey()), entry.getValue().getClass(), entry.getValue(), builder, null);
441435
}
442436
builder.close();
443437
} else {
444438
builder.add(name, new Value(ValueType.ARRAY));
445439
final Set<Entry<?, ?>> entrySet = map.entrySet();
446440
for (final Entry<?, ?> entry : entrySet) {
447441
builder.add(null, new Value(ValueType.OBJECT));
448-
addValue(null, ATTR_KEY, entry.getKey().getClass(), entry.getKey(), builder, null);
449-
addValue(null, ATTR_VALUE, entry.getValue().getClass(), entry.getValue(), builder, null);
442+
addValue(ATTR_KEY, entry.getKey().getClass(), entry.getKey(), builder, null);
443+
addValue(ATTR_VALUE, entry.getValue().getClass(), entry.getValue(), builder, null);
450444
builder.close();
451445
}
452446
builder.close();

src/main/java/com/arangodb/velocypack/internal/VPackCache.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,29 @@
2525
*/
2626
public class VPackCache {
2727

28-
public static class FieldInfo {
28+
public abstract static class FieldInfo {
29+
private final Class<?> type;
2930
private final String fieldName;
30-
private final Field field;
3131
private final boolean serialize;
3232
private final boolean deserialize;
3333
private final Class<?>[] parameterizedTypes;
3434

35-
private FieldInfo(final String fieldName, final Field field, final boolean serialize, final boolean deserialize,
36-
final Class<?>[] parameterizedTypes) {
35+
private FieldInfo(final Class<?> type, final String fieldName, final boolean serialize,
36+
final boolean deserialize, final Class<?>[] parameterizedTypes) {
3737
super();
38+
this.type = type;
3839
this.fieldName = fieldName;
39-
this.field = field;
4040
this.serialize = serialize;
4141
this.deserialize = deserialize;
4242
this.parameterizedTypes = parameterizedTypes;
4343
}
4444

45-
public String getFieldName() {
46-
return fieldName;
45+
public Class<?> getType() {
46+
return type;
4747
}
4848

49-
public Field getField() {
50-
return field;
49+
public String getFieldName() {
50+
return fieldName;
5151
}
5252

5353
public boolean isSerialize() {
@@ -61,6 +61,10 @@ public boolean isDeserialize() {
6161
public Class<?>[] getParameterizedTypes() {
6262
return parameterizedTypes;
6363
}
64+
65+
public abstract void set(Object obj, Object value) throws IllegalAccessException;
66+
67+
public abstract Object get(Object obj) throws IllegalAccessException;
6468
}
6569

6670
private final Map<Class<?>, Map<String, FieldInfo>> cache;
@@ -92,7 +96,9 @@ public Map<String, FieldInfo> getFields(final Class<?> entityClass) {
9296
if (!field.isSynthetic() && !Modifier.isStatic(field.getModifiers())) {
9397
field.setAccessible(true);
9498
final FieldInfo fieldInfo = createFieldInfo(field);
95-
fields.put(fieldInfo.getFieldName(), fieldInfo);
99+
if (fieldInfo.serialize || fieldInfo.deserialize) {
100+
fields.put(fieldInfo.getFieldName(), fieldInfo);
101+
}
96102
}
97103
}
98104
tmp = tmp.getSuperclass();
@@ -139,7 +145,17 @@ private FieldInfo createFieldInfo(final Field field) {
139145
? ParameterizedType.class.cast(argValueType).getRawType() : argValueType);
140146
parameterizedTypes = new Class<?>[] { key, value };
141147
}
142-
return new FieldInfo(fieldName, field, serialize, deserialize, parameterizedTypes);
148+
return new FieldInfo(field.getType(), fieldName, serialize, deserialize, parameterizedTypes) {
149+
@Override
150+
public void set(final Object obj, final Object value) throws IllegalAccessException {
151+
field.set(obj, value);
152+
}
153+
154+
@Override
155+
public Object get(final Object obj) throws IllegalAccessException {
156+
return field.get(obj);
157+
}
158+
};
143159
}
144160

145161
}

0 commit comments

Comments
 (0)
0