package nbtool.data.json;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import nbtool.data.json.Json.JsonValue;
import nbtool.util.Debug;
public class JsonReflection {
public static JsonObject serialize(Object obj, String ... excludeNames) {
Set<String> exclude = new HashSet<>(Arrays.asList(excludeNames));
if (obj instanceof JsonValue) {
throw new RuntimeException(
String.format("you use JsonReflection.serialize() on non-Json objects, not %s",
obj));
}
JsonObject ret = Json.object();
for (Field field : obj.getClass().getDeclaredFields()) {
int mod = field.getModifiers();
String name = field.getName();
if (Modifier.isPublic(mod) && !exclude.contains(name)) {
SerHandler handler = serializeHandlers.get(field.getType());
if (handler != null) {
ret.put(name, handler.handle(field));
} else {
Debug.warn("cannot serialize field of type %s in object %s!",
field.getType(), obj);
}
}
}
return ret;
}
private static interface SerHandler {
JsonValue handle(Field field);
}
private static interface DesHandler {
void handle(String name, Object to, JsonValue val);
}
private static Map<Class<?>, SerHandler> serializeHandlers;
private static Map<Class<? extends JsonValue>, DesHandler> deserialzeHandlers;
static {
serializeHandlers = new HashMap<>();
}
static class Test {
static int field = 5;
}
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
for (Field f : Test.class.getDeclaredFields()) {
Debug.print("%s %s", f.getType(), f.get(null));
}
}
}