Playwright Java: example returns error: Unable to make field [..] accessible

Playwright Java: example returns error: Unable to make field [..] accessible

我正在尝试 运行 Playwright Java 文档中的示例:https://playwright.dev/java/docs/intro#usage

我收到这个错误:

java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Object java.util.Optional.value accessible: module java.base does not "opens java.util" to unnamed module @3945bf41
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible (AccessibleObject.java:357)
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible (AccessibleObject.java:297)
    at java.lang.reflect.Field.checkCanSetAccessible (Field.java:177)
    at java.lang.reflect.Field.setAccessible (Field.java:171)
    at com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible (UnsafeReflectionAccessor.java:44)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory.java:159)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter (Gson.java:458)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField (ReflectiveTypeAdapterFactory.java:117)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields (ReflectiveTypeAdapterFactory.java:166)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create (ReflectiveTypeAdapterFactory.java:102)
    at com.google.gson.Gson.getAdapter (Gson.java:458)
    at com.google.gson.Gson.fromJson (Gson.java:931)
    at com.google.gson.Gson.fromJson (Gson.java:897)
    at com.google.gson.Gson.fromJson (Gson.java:846)
    at com.google.gson.Gson.fromJson (Gson.java:817)
    at com.microsoft.playwright.impl.Utils.convertViaJson (Utils.java:37)
    at com.microsoft.playwright.impl.BrowserImpl.newPageImpl (BrowserImpl.java:186)
    at com.microsoft.playwright.impl.BrowserImpl.lambda$newPage (BrowserImpl.java:182)
    at com.microsoft.playwright.impl.LoggingSupport.withLogging (LoggingSupport.java:47)
    at com.microsoft.playwright.impl.BrowserImpl.newPage (BrowserImpl.java:182)
    at com.microsoft.playwright.Browser.newPage (Browser.java:562)
    at org.example.Example.main (Example.java:9)
    at org.codehaus.mojo.exec.ExecJavaMojo.run (ExecJavaMojo.java:254)
    at java.lang.Thread.run (Thread.java:831

这是Example class:

package org.example;

import com.microsoft.playwright.*;

public class Example {
    public static void main(String[] args) {
        try (Playwright playwright = Playwright.create()) {
            Browser browser = playwright.chromium().launch();
            Page page = browser.newPage();
            page.navigate("http://playwright.dev");
            System.out.println(page.title());
        }
    }
}

我用的是编剧版1.10.0,我的Java是16.0.1版,我用的是Windows10.

我的完整代码可以在这里找到:https://github.com/christianbaumann/playwright-sandbox

自版本 16 Java 对其内部结构和 disallows programs from accessing them by default 提供更多保护。您可以通过将 --illegal-access=permit 添加到 java 命令行来解决此问题。

解释了底层 technology/decisions。让您感到惊讶的是 Java 16 在没有命令行参数的情况下改变了它的严格程度。以前的版本只是警告,但允许访问。