java - 将 VarHandle 转换为 java.lang.reflect.Field

标签 java reflection java-9

有什么方法可以将 VarHandle 转换为 java.lang.reflect.Field 吗?通过(getter/setter)MethodHandle,可以使用MethodHandles.reflectAs(Field.class, handle)MethodHandle转到Fieldlookup.unreflect{Getter|Setter}(field)Field 转到 MethodHandle。类似地,可以使用 lookup.unreflectVarHandle(field)FieldVarHandle,但似乎没有任何等效的方法从 VarHandleField

最佳答案

确实好像缺少这样的功能。

但从 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/

相关文章:

java - InetAddress.getLocalHost() 运行缓慢(30 秒以上)

java - 使用Java可搜索的行级加密?

c# - 如何从方法引用生成委托(delegate)类型?

Flow SubmissionPublisher 提供方法的 Java 9 行为

java - 如何使图像按钮在 Java/Android Studio 中单击时更改图像并在 ClickOut 时返回到其原始状态

java - 如何使用 Microsoft Exchange 发送电子邮件附件?

java - 如何读取系统本地路径中存在的 Java 文件的所有方法

c# - 如何检测方法自上次编译以来是否发生了变化?

java - 如果目标级别是 8,我可以使用 module-info.java 吗?

java - 运行 allure 命令行生成命令时出错