有什么方法可以将 VarHandle
转换为 java.lang.reflect.Field
吗?通过(getter/setter)MethodHandle
,可以使用MethodHandles.reflectAs(Field.class, handle)
从MethodHandle
转到Field
或 lookup.unreflect{Getter|Setter}(field)
从 Field
转到 MethodHandle
。类似地,可以使用 lookup.unreflectVarHandle(field)
从 Field
到 VarHandle
,但似乎没有任何等效的方法从 VarHandle
到 Field
。
最佳答案
确实好像缺少这样的功能。
但从 JDK 12 开始,您可以通过常量 API 模拟它:
Optional<Field> o = varHandle.describeConstable().map(d -> {
String mName = d.bootstrapMethod().methodName();
if(mName.equals("staticFieldVarHandle") || mName.equals("fieldVarHandle")) try {
return ((Class<?>)((ClassDesc)d.bootstrapArgsList().get(0))
.resolveConstantDesc(MethodHandles.lookup()))
.getDeclaredField(d.constantName());
} catch (ReflectiveOperationException ex) {}
return null;
});
当 VarHandle
描述可访问字段时,这会提供Field
。
关于java - 将 VarHandle 转换为 java.lang.reflect.Field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64526330/