package gminers.glasspane.ease; public class FriendlyFieldAccessor<T> implements FieldAccessor<T> { private Object access; private Class<?> clazz; private String field; private Class<?> setterClass; private String getterName; private String setterName; public FriendlyFieldAccessor(Object access, Class<?> clazz, Class<?> setterClass, String field) { this.access = access; this.clazz = clazz; this.field = field; this.setterClass = setterClass; getterName = "get" + firstCharUppercase(field); setterName = "set" + firstCharUppercase(field); } private String firstCharUppercase(String str) { if (str.isEmpty()) return str; return Character.toUpperCase(str.charAt(0)) + str.substring(1); } @SuppressWarnings("unchecked") @Override public T get() { try { return (T) clazz.getMethod(getterName).invoke(access); } catch (Exception e) { throw new RuntimeException("Could not get " + field + " from " + clazz.getName(), e); } } @Override public void set(T val) { try { clazz.getMethod(setterName, setterClass).invoke(access, val); } catch (Exception e) { throw new RuntimeException("Could not set " + field + " in " + clazz.getName(), e); } } }