package org.osgl.util; import org.osgl.Osgl; import org.osgl.exception.NotAppliedException; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Implement {@link PropertySetter} using Java reflection */ public class ReflectionPropertySetter extends ReflectionPropertyHandler implements PropertySetter { public ReflectionPropertySetter(Class c, Method m, Field f) { super(c, m, f); setNullValuePolicy(PropertyGetter.NullValuePolicy.CREATE_NEW); } public ReflectionPropertySetter(Osgl.Function<Class<?>, Object> objectFactory, Osgl.Func2<String, Class<?>, ?> stringValueResolver, Class entityClass, Method m, Field f) { super(objectFactory, stringValueResolver, PropertyGetter.NullValuePolicy.CREATE_NEW, entityClass, m, f); } @Override public void set(Object entity, Object value, Object index) { setProperty(entity, value); } private void setProperty(Object entity, Object value) throws NotAppliedException, Osgl.Break { if (null == entity) { return; } ensureMethodOrField(entity); try { doSet(entity, value); } catch (Exception e) { throw E.unexpected(e); } } protected void doSet(Object entity, Object value) throws Exception { Class requiredClass = super.getPropertyClass(entity); value = convertValue(requiredClass, value); if (null != m) { m.invoke(entity, value); } else { f.set(entity, value); } } protected Object convertValue(Class requiredClass, Object value) { if (null == value || requiredClass.isAssignableFrom(value.getClass())) { return value; } return stringValueResolver.apply(S.string(value), requiredClass); } }