Как правильно сделать членов FXML в Java 9 или 10?

После обновления до Java 10 (с 8) я получаю следующие ошибки:

InaccessibleObjectException: Unable to make field private javafx.scene.control.Button tech.flexpoint.dashman.controllers.configurator.RegistrationController.registerButton accessible: module tech.flexpoint.dashman does not "opens tech.flexpoint.dashman.controllers.configurator" to module javafx.fxml

Означает ли это, что я должен опубликовать их? Делает ли это аннотацию @FXML практически бесполезной в Java 9 и 10?


person pupeno    schedule 28.06.2018    source источник


Ответы (1)


Поскольку вы используете модуль, отражению по умолчанию не разрешен доступ к закрытым членам ваших классов. Исключение в основном говорит вам, что нужно сделать:

module tech.flexpoint.dashman {
    ...

    // allow everyone to access classes in tech.flexpoint.dashman.controllers.configurator via reflection
    opens tech.flexpoint.dashman.controllers.configurator;
}

or

module tech.flexpoint.dashman {
    ...

    // allow only module javafx.fxml access classes in tech.flexpoint.dashman.controllers.configurator via reflection
    opens tech.flexpoint.dashman.controllers.configurator to javafx.fxml;
}

Это не делает @FXML бесполезным. По-прежнему необходимо помечать не-4_ члены, которые разрешено использовать FXMLLoader, просто необходимо явно указать, что отражение может переопределять доступ к членам. (FXMLLoader использует отражение, поэтому, по крайней мере, модуль javafx.fxml нуждается в таком доступе для работы инъекции.)

В зависимости от содержимого вашего пакета может быть полезно переместить контроллер (ы) в его собственный подпакет, чтобы не разрешить отражающий доступ к классам, не являющимся контроллерами.

person fabian    schedule 28.06.2018