package com.alibaba.fastjson.parser.deserializer; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Collection; import java.util.Map; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.util.FieldInfo; public abstract class FieldDeserializer { protected final FieldInfo fieldInfo; protected final Class<?> clazz; public FieldDeserializer(Class<?> clazz, FieldInfo fieldInfo) { this.clazz = clazz; this.fieldInfo = fieldInfo; } public Method getMethod() { return fieldInfo.getMethod(); } public Class<?> getFieldClass() { return fieldInfo.getFieldClass(); } public Type getFieldType() { return fieldInfo.getFieldType(); } public abstract void parseField(DefaultJSONParser parser, Object object, Type objectType, Map<String, Object> fieldValues); public abstract int getFastMatchToken(); public void setValue(Object object, boolean value) { setValue(object, Boolean.valueOf(value)); } public void setValue(Object object, int value) { setValue(object, Integer.valueOf(value)); } public void setValue(Object object, long value) { setValue(object, Long.valueOf(value)); } public void setValue(Object object, String value) { setValue(object, (Object) value); } @SuppressWarnings({"rawtypes", "unchecked"}) public void setValue(Object object, Object value) { Method method = fieldInfo.getMethod(); if (method != null) { try { if (fieldInfo.isGetOnly()) { Collection collection = (Collection) method.invoke(object); collection.addAll((Collection) value); } else { method.invoke(object, value); } } catch (Exception e) { throw new JSONException("set property error, " + fieldInfo.getName(), e); } } else if (fieldInfo.getField() != null) { try { fieldInfo.getField().set(object, value); } catch (Exception e) { throw new JSONException("set property error, " + fieldInfo.getName(), e); } } } }