@@ -42,16 +42,20 @@ public abstract class AbstractMappedClassFieldObserver {
4242 * Inside auxiliary method to read object field value.
4343 *
4444 * @param obj an object which field is read
45- * @param field a field to be read
45+ * @param record field record, must not be null
4646 * @return a value from the field of the object
4747 * @throws JBBPException if the field can't be read
48- * @since 1.1
48+ * @since 2.0
4949 */
50- private static Object readFieldValue (final Object obj , final Field field ) {
50+ private static Object readFieldValue (final Object obj , final MappedFieldRecord record ) {
5151 try {
52- return field .get (obj );
52+ if (record .getter == null ) {
53+ return record .mappingField .get (obj );
54+ } else {
55+ return record .getter .invoke (obj );
56+ }
5357 } catch (Exception ex ) {
54- throw new JBBPException ("Can't get value from field [" + field + ']' , ex );
58+ throw new JBBPException ("Can't get value from field [" + record + ']' , ex );
5559 }
5660 }
5761
@@ -79,6 +83,7 @@ protected void processObject(final Object obj, Field field, final Object customF
7983
8084 final List <MappedFieldRecord > orderedFields = JBBPMapper .findAffectedFields (obj );
8185
86+ //TODO check DslBinCustom
8287 final Bin clazzAnno = obj .getClass ().getAnnotation (Bin .class );
8388 final DslBinCustom clazzCustomAnno = obj .getClass ().getAnnotation (DslBinCustom .class );
8489 final Bin fieldAnno = field == null ? null : field .getAnnotation (Bin .class );
@@ -93,7 +98,7 @@ protected void processObject(final Object obj, Field field, final Object customF
9398 throw new JBBPIllegalArgumentException ("The Class '" + obj .getClass ().getName () + "' contains the field '" + rec .mappingField .getName () + "\' which is a custom one, you must provide a JBBPCustomFieldWriter instance to save the field." );
9499 }
95100
96- processObjectField (obj , rec . mappingField , binAnno , customFieldProcessor );
101+ processObjectField (obj , rec , binAnno , customFieldProcessor );
97102 }
98103
99104 this .onStructEnd (obj , field , clazzAnno == null ? fieldAnno : clazzAnno );
@@ -103,15 +108,16 @@ protected void processObject(final Object obj, Field field, final Object customF
103108 * Inside auxiliary method to process a field of an object.
104109 *
105110 * @param obj the object which field under processing, must not be null
106- * @param field the field to be written , must not be null
111+ * @param fieldRecord internal record about the field, must not be null
107112 * @param annotation the annotation to be used as data source about the field,
108113 * must not be null
109114 * @param customFieldProcessor an object which will be provided for processing
110115 * of custom fields, must not be null if object contains custom fields
111116 */
112- protected void processObjectField (final Object obj , final Field field , final Bin annotation , final Object customFieldProcessor ) {
117+ protected void processObjectField (final Object obj , final MappedFieldRecord fieldRecord , final Bin annotation , final Object customFieldProcessor ) {
118+ final Field field = fieldRecord .mappingField ;
113119 if (annotation .custom ()) {
114- this .onFieldCustom (obj , field , annotation , customFieldProcessor , readFieldValue (obj , field ));
120+ this .onFieldCustom (obj , field , annotation , customFieldProcessor , readFieldValue (obj , fieldRecord ));
115121 } else {
116122 final Class <?> fieldType = field .getType ();
117123
@@ -128,9 +134,9 @@ protected void processObjectField(final Object obj, final Field field, final Bin
128134 case BIT : {
129135 final JBBPBitNumber bitNumber = annotation .outBitNumber ();
130136 if (fieldType == boolean .class ) {
131- this .onFieldBits (obj , field , annotation , bitNumber , ((Boolean ) readFieldValue (obj , field )) ? 0xFF : 0x00 );
137+ this .onFieldBits (obj , field , annotation , bitNumber , ((Boolean ) readFieldValue (obj , fieldRecord )) ? 0xFF : 0x00 );
132138 } else {
133- byte value = ((Number ) readFieldValue (obj , field )).byteValue ();
139+ byte value = ((Number ) readFieldValue (obj , fieldRecord )).byteValue ();
134140 if (reverseBits ) {
135141 value = JBBPUtils .reverseBitsInByte (bitNumber , value );
136142 }
@@ -140,15 +146,15 @@ protected void processObjectField(final Object obj, final Field field, final Bin
140146 break ;
141147 case BOOL : {
142148 if (fieldType == boolean .class ) {
143- onFieldBool (obj , field , annotation , (Boolean ) readFieldValue (obj , field ));
149+ onFieldBool (obj , field , annotation , (Boolean ) readFieldValue (obj , fieldRecord ));
144150 } else {
145- onFieldBool (obj , field , annotation , ((Number ) readFieldValue (obj , field )).longValue () != 0 );
151+ onFieldBool (obj , field , annotation , ((Number ) readFieldValue (obj , fieldRecord )).longValue () != 0 );
146152 }
147153 }
148154 break ;
149155 case BYTE :
150156 case UBYTE : {
151- byte value = ((Number ) readFieldValue (obj , field )).byteValue ();
157+ byte value = ((Number ) readFieldValue (obj , fieldRecord )).byteValue ();
152158 if (reverseBits ) {
153159 value = JBBPUtils .reverseBitsInByte (value );
154160 }
@@ -159,9 +165,9 @@ protected void processObjectField(final Object obj, final Field field, final Bin
159165 case USHORT : {
160166 short value ;
161167 if (fieldType == char .class ) {
162- value = (short ) ((Character ) readFieldValue (obj , field )).charValue ();
168+ value = (short ) ((Character ) readFieldValue (obj , fieldRecord )).charValue ();
163169 } else {
164- value = ((Number ) readFieldValue (obj , field )).shortValue ();
170+ value = ((Number ) readFieldValue (obj , fieldRecord )).shortValue ();
165171 }
166172 if (reverseBits ) {
167173 value = (short ) JBBPFieldShort .reverseBits (value );
@@ -171,7 +177,7 @@ protected void processObjectField(final Object obj, final Field field, final Bin
171177 break ;
172178 case INT : {
173179 int value ;
174- value = ((Number ) readFieldValue (obj , field )).intValue ();
180+ value = ((Number ) readFieldValue (obj , fieldRecord )).intValue ();
175181 if (reverseBits ) {
176182 value = (int ) JBBPFieldInt .reverseBits (value );
177183 }
@@ -181,9 +187,9 @@ protected void processObjectField(final Object obj, final Field field, final Bin
181187 case FLOAT : {
182188 float value ;
183189 if (float .class == fieldType ) {
184- value = (Float ) readFieldValue (obj , field );
190+ value = (Float ) readFieldValue (obj , fieldRecord );
185191 } else {
186- value = ((Number ) readFieldValue (obj , field )).floatValue ();
192+ value = ((Number ) readFieldValue (obj , fieldRecord )).floatValue ();
187193 }
188194 if (reverseBits ) {
189195 value = Float .intBitsToFloat ((int ) JBBPFieldInt .reverseBits (Float .floatToIntBits (value )));
@@ -193,7 +199,7 @@ protected void processObjectField(final Object obj, final Field field, final Bin
193199 break ;
194200 case STRING : {
195201 String value ;
196- final Object valueAsObject = readFieldValue (obj , field );
202+ final Object valueAsObject = readFieldValue (obj , fieldRecord );
197203 if (valueAsObject != null ) {
198204 value = String .valueOf (valueAsObject );
199205 if (reverseBits ) {
@@ -206,7 +212,7 @@ protected void processObjectField(final Object obj, final Field field, final Bin
206212 }
207213 break ;
208214 case LONG : {
209- long value = ((Number ) readFieldValue (obj , field )).longValue ();
215+ long value = ((Number ) readFieldValue (obj , fieldRecord )).longValue ();
210216 if (reverseBits ) {
211217 value = JBBPFieldLong .reverseBits (value );
212218 }
@@ -216,11 +222,11 @@ protected void processObjectField(final Object obj, final Field field, final Bin
216222 case DOUBLE : {
217223 double value ;
218224 if (float .class == fieldType ) {
219- value = (Float ) readFieldValue (obj , field );
225+ value = (Float ) readFieldValue (obj , fieldRecord );
220226 } else if (double .class == fieldType ) {
221- value = (Double ) readFieldValue (obj , field );
227+ value = (Double ) readFieldValue (obj , fieldRecord );
222228 } else {
223- value = ((Number ) readFieldValue (obj , field )).doubleValue ();
229+ value = ((Number ) readFieldValue (obj , fieldRecord )).doubleValue ();
224230 }
225231
226232 if (reverseBits ) {
@@ -230,11 +236,11 @@ protected void processObjectField(final Object obj, final Field field, final Bin
230236 }
231237 break ;
232238 case STRUCT : {
233- processObject (readFieldValue (obj , field ), field , customFieldProcessor );
239+ processObject (readFieldValue (obj , fieldRecord ), field , customFieldProcessor );
234240 }
235241 break ;
236242 default : {
237- final Object array = readFieldValue (obj , field );
243+ final Object array = readFieldValue (obj , fieldRecord );
238244 switch (type ) {
239245 case BIT_ARRAY : {
240246 assertFieldArray (field );
@@ -279,7 +285,7 @@ protected void processObjectField(final Object obj, final Field field, final Bin
279285 final boolean signed = type == BinType .BYTE_ARRAY ;
280286
281287 if (fieldType == String .class ) {
282- final String strValue = (String ) readFieldValue (obj , field );
288+ final String strValue = (String ) readFieldValue (obj , fieldRecord );
283289 this .onArrayStart (obj , field , annotation , strValue .length ());
284290
285291 for (int i = 0 ; i < strValue .length (); i ++) {
@@ -310,7 +316,7 @@ protected void processObjectField(final Object obj, final Field field, final Bin
310316 final boolean signed = type == BinType .SHORT_ARRAY ;
311317
312318 if (fieldType == String .class ) {
313- final String str = (String ) readFieldValue (obj , field );
319+ final String str = (String ) readFieldValue (obj , fieldRecord );
314320 this .onArrayStart (obj , field , annotation , str .length ());
315321
316322 for (int i = 0 ; i < str .length (); i ++) {
0 commit comments