Исключение в потоке "Thread-0" java.lang.reflect.InaccessibleObjectException - PullRequest
0 голосов
/ 28 июня 2019

Попытка запустить сервер и клиент в моем проекте Java, который состоит из настольной игры, выполненной в CLI и GUI.К сожалению, я попал в эту ошибку после добавления имени пользователя:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson

Вот общая ошибка:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:341)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
    at gson@2.8.5/com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:926)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:892)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:841)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:813)
    at project/controller.JsonUnwrapper.sendJson(JsonUnwrapper.java:99)
    at project/network.Socket.JsonRouterSocket.run(JsonRouterSocket.java:55)
    at java.base/java.lang.Thread.run(Thread.java:835)

Почему-то кажется, что существует конфликт между javafx и GSON.Самое смешное, что я запускаю сервер и клиент, используя CLI (который не нуждается в javafx), а не GUI.Предполагается, что Gson должен вернуть некоторую информацию (включая цвета), но при вызове!Я даже не выполняю команду, которая должна вернуть мне некоторую информацию!

Связь может быть установлена ​​с RMI или сокетами, но ошибка сохраняется на них обоих!

Более того, проектсделанный мной и 2 другими парнями.Один из них использует Linux, а другой - Windows 10 (как я), но пока ни у кого из них нет этой проблемы!

1 Ответ

0 голосов
/ 28 июня 2019

Этот тип ошибок возникает из-за модульности в java 9.

Ошибка говорит о том, что модуль gson хотел получить доступ к полю класса javafx.scene.paint.Color с помощью отражения.В java 8 это прекрасно работает , потому что отражение может использоваться, чтобы сделать даже частные поля публичными, но когда с использованием java 9, существуют некоторые новые ограничения для рефлексии , которые приводят к ошибкам, подобным этой.

Как объяснено здесь , в java 9 вы не можете использовать отражение, чтобы получить доступ к типу модуля, который не экспортируется модулем, поэтому отражение (как в gson)) больше не будет работать.

Решением этой проблемы может быть одно из следующих:

  • Использование java 8 и отсутствие модульности (если это возможно для вашегопроект)
  • Используйте параметр командной строки --add-opens, который открывает пакет модуля, поэтому отражение должно быть снова использовано
  • Откройте модуль в файл module-info.java (который не будет работать в вашем случае, потому что у вас нет доступа к module-info.java из javafx; только что упомянут для полноты)
  • Добавьте библиотеки (javafx и gson) в инстансе CLASSPATHНапример, MODULEPATH , который приведет к режиму совместимости, в котором также должно быть возможно отражение.

Поскольку у двух других упомянутых вами разработчиков нет этой проблемы, я предполагаю, что они используют либоjava 8 или поместили библиотеки в CLASSPATH, потому что это всего лишь изменение в настройке проекта, а не в коде.Так что это будет объяснение, почему только вы столкнулись с этой проблемой.

...