package openmods.reflection; import com.google.common.base.Throwables; import java.lang.reflect.Field; public class InstanceFieldAccess<T> { public final Object target; public final Field field; public InstanceFieldAccess(Object parent, Field field) { this(parent, field, true); } private InstanceFieldAccess(Object parent, Field field, boolean log) { if (log) ReflectionLog.logLoad(field); this.target = parent; this.field = field; field.setAccessible(true); } @SuppressWarnings("unchecked") public T get() { try { return (T)field.get(target); } catch (Exception e) { throw Throwables.propagate(e); } } public void set(T value) { try { field.set(target, value); } catch (Exception e) { throw Throwables.propagate(e); } } public static <T> InstanceFieldAccess<T> create(Class<?> cls, Object target, String... names) { Field f = ReflectionHelper.getField(cls, names); return new InstanceFieldAccess<T>(target, f, false); // log done in ReflectionHelper } public static <T> InstanceFieldAccess<T> create(Class<?> cls, String... names) { return create(cls, null, names); } public static <T> InstanceFieldAccess<T> create(Object target, String... names) { return create(target.getClass(), target, names); } }