¿Cómo puedo crear una implementación de interfaz funcional para campos?

Considera un campoweight en la claseAnimal. Quiero poder crear unadquiridor ysetter objetos de interfaz funcional para manipular este campo.

class Animal {
  int weight;
}

Mi enfoque actual es similar al utilizado para los métodos:

public static Supplier getter(Object obj, Class<?> cls, Field f) throws Exception {
  boolean isstatic = Modifier.isStatic(f.getModifiers());
  MethodType sSig = MethodType.methodType(f.getType());
  Class<?> dCls = Supplier.class;
  MethodType dSig = MethodType.methodType(Object.class);
  String dMthd = "get";
  MethodType dType = isstatic? MethodType.methodType(dCls) : MethodType.methodType(dCls, cls);
  MethodHandles.Lookup lookup = MethodHandles.lookup();
  MethodHandle fctry = LambdaMetafactory.metafactory(lookup, dMthd, dType, dSig, lookup.unreflectGetter(f), sSig).getTarget();
  fctry = !isstatic && obj!=null? fctry.bindTo(obj) : fctry;
  return (Supplier)fctry.invoke();
}

Pero esto da el siguiente error:

java.lang.invoke.LambdaConversionException: Unsupported MethodHandle kind: getField x.Animal.weight:()int

ACTUALIZAR

Estoy tratando de crear una claseObjectMap implementarinterface Map, que básicamente trata derepresentar unobjeto como unMap, donde elobjeto puede ser dealguna tipo. Estaba usando actualmenteField.get() yField.set() para manipular campos enget() yput() métodos y el uso del enfoque mencionado anteriormente para crearSupplier yConsumer objetos para invocaradquiridor ysetter métodos Me preguntaba si podría fusionar los dos métodos por separado en uno.

Clase de ejemplo que podría usarse comoMap medianteObjectMap:

public class ThisCanBeAnything {
  /* fields */
  public String normalField;
  private int hiddenFiled;
  private String hiddenReadonlyField;

  /* getters and setters */
  public int hiddenField() {
    return hiddenField;
  }
  public void hiddenField(int v) {
    System.out.println("set: hiddenField="+v);
    hiddenField = v;
  }

  public String hiddenReadonlyField() {
    return hiddenReadonlyField;
  }
}

Y aquí está el uso esperado:

Object o = new ThisCanBeAnything();
Map m = new ObjectMap(o);
m.put("normalField", "Normal");
System.out.println(m.get("normalField")); // Normal
m.put("hiddenField", 1); // set: hiddenField=1
System.out.println(m.get("hiddenField")); // 1
m.put("hiddenReadonlyField", 1); // does not do anything
System.out.println(m.get("hiddenReadonlyField")); // null

Respuestas a la pregunta(5)

Su respuesta a la pregunta