package org.apereo.cas.ticket.registry.support.kryo; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; /** * Helper class that provides convenience methods for getting and setting field values via reflection. * * @author Marvin S. Addison * @since 3.0.0 */ public class FieldHelper { private final Map<String, Field> fieldCache = new HashMap<>(); /** * Gets the field value. * * @param target the target * @param fieldName the field name * @return the field value */ public Object getFieldValue(final Object target, final String fieldName) { final Field f = getField(target, fieldName); try { return f.get(target); } catch (final IllegalAccessException e) { throw new IllegalStateException("Error getting field value", e); } } /** * Sets the field value. * * @param target the target * @param fieldName the field name * @param value the value */ public void setFieldValue(final Object target, final String fieldName, final Object value) { final Field f = getField(target, fieldName); try { f.set(target, value); } catch (final IllegalAccessException e) { throw new IllegalStateException("Error setting field value", e); } } /** * Gets the field. * * @param target the target * @param name the name * @return the field */ private Field getField(final Object target, final String name) { Class<?> clazz = target.getClass(); final String key = new StringBuilder().append(clazz.getName()).append('.').append(name).toString(); Field f = this.fieldCache.get(key); while (f == null) { try { f = clazz.getDeclaredField(name); f.setAccessible(true); this.fieldCache.put(key, f); } catch (final NoSuchFieldException e) { clazz = clazz.getSuperclass(); if (clazz == null) { throw new IllegalStateException("No such field " + key); } } } return f; } }