package com.fasterxml.jackson.jr.ob.impl;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.jr.ob.JSONObjectException;

Simple container class used to contain information needed for serializing value of a single POJO property.
Since:2.8
/** * Simple container class used to contain information needed for serializing * value of a single POJO property. * * @since 2.8 */
public final class BeanPropertyWriter { public final SerializedString name; public final int typeId; private final Field _field; private final Method _getter; public BeanPropertyWriter(int typeId, String n, Field f, Method getter) { this.typeId = typeId; name = new SerializedString(n); if ((getter == null) && (f == null)) { throw new IllegalArgumentException("Missing getter and field"); } _field = f; _getter = getter; }
Since:2.10
/** * @since 2.10 */
public BeanPropertyWriter withName(String newName) { if (name.toString().equals(newName)) { return this; } return new BeanPropertyWriter(typeId, newName, _field, _getter); } public Object getValueFor(Object bean) throws IOException { try { if (_getter == null) { return _field.get(bean); } return _getter.invoke(bean); } catch (Exception e) { final String accessorDesc = (_getter != null) ? String.format("method %s.%s()", _bean(), _getter.getName()) : String.format("field %s.%s", _bean(), _field.getName()); throw new JSONObjectException(String.format( "Failed to access property '%s' (using %s); exception (%s): %s", name, e.getClass().getName(), accessorDesc, e.getMessage()), e); } } protected String _bean() { if (_getter == null) { return _field.getDeclaringClass().getName(); } return _getter.getDeclaringClass().getName(); } }