diff --git a/src/main/java/org/warp/commonutils/moshi/MoshiPolymorphic.java b/src/main/java/org/warp/commonutils/moshi/MoshiPolymorphic.java index 33d7e8b..e340b3f 100644 --- a/src/main/java/org/warp/commonutils/moshi/MoshiPolymorphic.java +++ b/src/main/java/org/warp/commonutils/moshi/MoshiPolymorphic.java @@ -11,16 +11,17 @@ import dev.zacsweers.moshix.records.RecordsJsonAdapterFactory; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; import java.lang.reflect.Type; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiFunction; import java.util.function.Function; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -191,19 +192,25 @@ public abstract class MoshiPolymorphic { private final String adapterName; private final Options names; private final Class declaredClass; - private final Field[] declaredFields; + private final List declaredFields; private final Function[] fieldGetters; private NormalValueAdapter(String adapterName, Class declaredClass) { try { this.adapterName = adapterName; this.declaredClass = declaredClass; - var declaredFields = new ArrayList<>(List.of(declaredClass.getDeclaredFields())); - declaredFields.removeIf(field -> shouldIgnoreField(field.getName())); - this.declaredFields = declaredFields.toArray(Field[]::new); - String[] fieldNames = new String[this.declaredFields.length]; + this.declaredFields = Arrays + .stream(declaredClass.getDeclaredFields()) + .filter(field -> { + var modifiers = field.getModifiers(); + return !Modifier.isStatic(modifiers) + && !Modifier.isTransient(modifiers) + && !shouldIgnoreField(field.getName()); + }) + .collect(Collectors.toList()); + String[] fieldNames = new String[this.declaredFields.size()]; //noinspection unchecked - this.fieldGetters = new Function[this.declaredFields.length]; + this.fieldGetters = new Function[this.declaredFields.size()]; int i = 0; for (Field declaredField : this.declaredFields) { fieldNames[i] = declaredField.getName(); @@ -258,7 +265,7 @@ public abstract class MoshiPolymorphic { Object instance; Object[] fields; if (instantiateUsingStaticOf) { - fields = new Object[declaredFields.length]; + fields = new Object[declaredFields.size()]; instance = null; } else { fields = null; @@ -268,12 +275,12 @@ public abstract class MoshiPolymorphic { jsonReader.beginObject(); while (jsonReader.hasNext()) { var nameId = jsonReader.selectName(names); - if (nameId >= 0 && nameId < this.declaredFields.length) { - var fieldValue = abstractMoshi.adapter(declaredFields[nameId].getGenericType()).fromJson(jsonReader); + if (nameId >= 0 && nameId < this.declaredFields.size()) { + var fieldValue = abstractMoshi.adapter(declaredFields.get(nameId).getGenericType()).fromJson(jsonReader); if (instantiateUsingStaticOf) { fields[nameId] = fieldValue; } else { - declaredFields[nameId].set(instance, fieldValue); + declaredFields.get(nameId).set(instance, fieldValue); } } else { String keyName = jsonReader.nextName(); @@ -283,9 +290,9 @@ public abstract class MoshiPolymorphic { jsonReader.endObject(); if (instantiateUsingStaticOf) { - Class[] params = new Class[declaredFields.length]; - for (int i = 0; i < declaredFields.length; i++) { - params[i] = declaredFields[i].getType(); + Class[] params = new Class[declaredFields.size()]; + for (int i = 0; i < declaredFields.size(); i++) { + params[i] = declaredFields.get(i).getType(); } instance = declaredClass.getMethod("of", params).invoke(null, fields); }