in modules/marshaller-common/src/main/java/org/apache/ignite/internal/marshaller/FieldAccessor.java [72:133]
static FieldAccessor create(Class<?> type, String fldName, MarshallerColumn col, int colIdx) {
try {
final Field field = type.getDeclaredField(fldName);
MarshallerUtil.validateColumnType(col, field.getType());
BinaryMode mode = MarshallerUtil.mode(field.getType());
final MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(type, MethodHandles.lookup());
VarHandle varHandle = lookup.unreflectVarHandle(field);
assert mode != null : "Invalid mode for type: " + field.getType();
switch (mode) {
case P_BOOLEAN:
return new BooleanPrimitiveAccessor(varHandle, colIdx);
case P_BYTE:
return new BytePrimitiveAccessor(varHandle, colIdx);
case P_SHORT:
return new ShortPrimitiveAccessor(varHandle, colIdx);
case P_INT:
return new IntPrimitiveAccessor(varHandle, colIdx);
case P_LONG:
return new LongPrimitiveAccessor(varHandle, colIdx);
case P_FLOAT:
return new FloatPrimitiveAccessor(varHandle, colIdx);
case P_DOUBLE:
return new DoublePrimitiveAccessor(varHandle, colIdx);
case BOOLEAN:
case BYTE:
case SHORT:
case INT:
case LONG:
case FLOAT:
case DOUBLE:
case STRING:
case UUID:
case BYTE_ARR:
case BITSET:
case NUMBER:
case DECIMAL:
case TIME:
case DATE:
case DATETIME:
case TIMESTAMP:
return new ReferenceFieldAccessor(varHandle, colIdx, mode, col.scale());
default:
assert false : "Invalid mode " + mode;
}
throw new IllegalArgumentException("Failed to create accessor for field [name=" + field.getName() + ']');
} catch (NoSuchFieldException | SecurityException | IllegalAccessException ex) {
throw new IllegalArgumentException(ex);
}
}