44import com .jsoniter .any .Any ;
55
66import java .io .IOException ;
7+ import java .lang .reflect .Field ;
8+ import java .util .ArrayList ;
79import java .util .HashMap ;
10+ import java .util .List ;
811import java .util .Map ;
912
1013class ReflectionObjectEncoder implements Encoder .ReflectionEncoder {
1114
1215 private final ClassDescriptor desc ;
16+ private final List <EncodeTo > fields = new ArrayList <EncodeTo >();
17+ private final List <EncodeTo > getters = new ArrayList <EncodeTo >();
1318
1419 public ReflectionObjectEncoder (ClassInfo classInfo ) {
1520 desc = ClassDescriptor .getEncodingClassDescriptor (classInfo , true );
16- for (Binding binding : desc .allEncoderBindings ()) {
21+ for (EncodeTo encodeTo : desc .encodeTos ()) {
22+ Binding binding = encodeTo .binding ;
1723 if (binding .encoder == null ) {
1824 // the field encoder might be registered directly
1925 binding .encoder = JsoniterSpi .getEncoder (binding .encoderCacheKey ());
2026 }
27+ if (binding .field != null ) {
28+ fields .add (encodeTo );
29+ } else {
30+ getters .add (encodeTo );
31+ }
2132 }
2233 }
2334
@@ -34,17 +45,13 @@ public void encode(Object obj, JsonStream stream) throws IOException {
3445 public Any wrap (Object obj ) {
3546 HashMap <String , Object > copied = new HashMap <String , Object >();
3647 try {
37- for (Binding field : desc .fields ) {
38- Object val = field .field .get (obj );
39- for (String toName : field .toNames ) {
40- copied .put (toName , val );
41- }
48+ for (EncodeTo encodeTo : fields ) {
49+ Object val = encodeTo .binding .field .get (obj );
50+ copied .put (encodeTo .toName , val );
4251 }
43- for (Binding getter : desc .getters ) {
44- Object val = getter .method .invoke (obj );
45- for (String toName : getter .toNames ) {
46- copied .put (toName , val );
47- }
52+ for (EncodeTo getter : getters ) {
53+ Object val = getter .binding .method .invoke (obj );
54+ copied .put (getter .toName , val );
4855 }
4956 } catch (Exception e ) {
5057 throw new JsonException (e );
@@ -59,41 +66,13 @@ private void enocde_(Object obj, JsonStream stream) throws Exception {
5966 }
6067 stream .writeObjectStart ();
6168 boolean notFirst = false ;
62- for (Binding field : desc .fields ) {
63- Object val = field .field .get (obj );
64- for (String toName : field .toNames ) {
65- if (!(field .shouldOmitNull && val == null )) {
66- if (notFirst ) {
67- stream .writeMore ();
68- } else {
69- notFirst = true ;
70- }
71- stream .writeObjectField (toName );
72- if (field .encoder != null ) {
73- field .encoder .encode (val , stream );
74- } else {
75- stream .writeVal (val );
76- }
77- }
78- }
69+ for (EncodeTo encodeTo : fields ) {
70+ Object val = encodeTo .binding .field .get (obj );
71+ notFirst = writeEncodeTo (stream , notFirst , encodeTo , val );
7972 }
80- for (Binding getter : desc .getters ) {
81- Object val = getter .method .invoke (obj );
82- for (String toName : getter .toNames ) {
83- if (!(getter .shouldOmitNull && val == null )) {
84- if (notFirst ) {
85- stream .writeMore ();
86- } else {
87- notFirst = true ;
88- }
89- stream .writeObjectField (toName );
90- if (getter .encoder != null ) {
91- getter .encoder .encode (val , stream );
92- } else {
93- stream .writeVal (val );
94- }
95- }
96- }
73+ for (EncodeTo encodeTo : getters ) {
74+ Object val = encodeTo .binding .method .invoke (obj );
75+ notFirst = writeEncodeTo (stream , notFirst , encodeTo , val );
9776 }
9877 for (UnwrapperDescriptor unwrapper : desc .unwrappers ) {
9978 if (unwrapper .isMap ) {
@@ -118,4 +97,21 @@ private void enocde_(Object obj, JsonStream stream) throws Exception {
11897 }
11998 stream .writeObjectEnd ();
12099 }
100+
101+ private boolean writeEncodeTo (JsonStream stream , boolean notFirst , EncodeTo encodeTo , Object val ) throws IOException {
102+ if (!(encodeTo .binding .shouldOmitNull && val == null )) {
103+ if (notFirst ) {
104+ stream .writeMore ();
105+ } else {
106+ notFirst = true ;
107+ }
108+ stream .writeObjectField (encodeTo .toName );
109+ if (encodeTo .binding .encoder != null ) {
110+ encodeTo .binding .encoder .encode (val , stream );
111+ } else {
112+ stream .writeVal (val );
113+ }
114+ }
115+ return notFirst ;
116+ }
121117}
0 commit comments