考慮類Animal
中的字段weight
。我希望能夠創建一個getter和setter用於操作此字段的功能接口對象。如何爲字段創建Functional接口實現?
class Animal {
int weight;
}
我目前的做法是類似於一個用於方法:
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();
}
但是,這提供了以下錯誤:
java.lang.invoke.LambdaConversionException: Unsupported MethodHandle kind: getField x.Animal.weight:()int
UPDATE
我想創建一個類ObjectMap
實施interface Map
,基本上試圖表示一個對象作爲Map
,其中對象可以是任何類型。目前正在使用Field.get()
並Field.set()
用於get()
和put()
方法操縱領域,並使用上述的方法來創建用於調用吸氣和設定器方法Supplier
和Consumer
對象。我想知道是否可以將兩種單獨的方法合併爲一個。
實例類,它可以作爲一個Map
通過ObjectMap
:
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;
}
}
這裏是預期使用:
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
謝謝。這確實解決了我的目的,但是你仍然在'Field.get()'中使用反射。在方法的情況下,我使用上述方法來獲取可以直接調用的接口對象。如果可以採取類似的方法,那將會很好。 – wolfram77
那是你的出發點,傳遞'場'。你沒有說你是怎麼得到的。我不明白你對評論的額外要求。 – weston
我確實需要一個供應商對象,但如果它速度更快,那就更好了。所以,期待一種比反思更快的方法。 – wolfram77