Как получить доступ к частным / защищенным пакетам полям и методам в модульной системе Java? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь получить доступ к горизонтальному ScrollBar для VirtualFlow, который является внутренним контролем для TableView. Моя рабочая среда:

  • OS - Windows 10
  • IDE - Eclipse v. 2020-03 (4.15.0)
  • JDK - jdk-10.0. 2
  • Компилятор - maven-compiler-plugin 3.8.1 (m2E для Eclipse)

Приведенный ниже код пытается получить доступ к VirtualFlow (который является полем с именем flow в TableViewSkinBase, родительской обложке для TableView), а затем для доступа к горизонтальной ScrollBar:

private void xxx() {
      final TableView<R> tableView = new TableView<>();
      final TableViewSkin<R> skin = (TableViewSkin<R>) tableView.getSkin();
      try {
           final Field flowField = TableViewSkinBase.class.getDeclaredField("flow");
           flowField.setAccessible(true);
           final Method hbarMethod = VirtualFlow.class.getDeclaredMethod("getHbar");
           hbarMethod.setAccessible(true);

           final VirtualFlow<IndexedCell<R>> flow = (VirtualFlow<IndexedCell<R>>) flowField.get(skin);
           ScrollBar hbar = (ScrollBar) flowField.get(flow);
      }
      catch (NoSuchMethodException | SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException ex) {
           ex.printStackTrace();
      }
 }

Фрагмент ниже взят из записи в файле .pom для плагин компилятора:

<plugin>
            <!-- http://maven.apache.org/plugins/maven-compiler-plugin/ -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>10</source>
                <target>10</target>
                <compilerArgs>
                    <arg>--add-opens=javafx.scene.control=ALL-UNNAMED</arg>
                    <arg>--add-opens=javafx.scene.control.skin=ALL-UNNAMED</arg>
                </compilerArgs>
            </configuration>
</plugin>

InaccessibleObjectException добавляется в строку flowField.setAccessible(true) в блоке try/catch с сообщением:

Unable to make field javafx.scene.control.skin.VirtualFlow javafx.scene.control.skin.TableViewSkinBase.flow accessible: module javafx.controls does not "opens javafx.scene.control.skin" to unnamed module @418e9723

Я почти уверен, что есть еще здесь больше одной ошибки, и будем благодарны за их указание; был бы полезен пример, основанный на рабочей среде, описанной выше.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...