====== Расширители доступа (Access Wideners) ======
Расширители доступа предоставляют возможность ослабить ограничения доступа к классам, методам или полям. Расширители доступа похожи на широко известные Access Transformers.
Расширители доступа могут использоваться вместо аксессора миксинов, и в настоящее время есть 2 случая, когда функциональности, предоставляемой миксином, недостаточно:
* Необходимость доступа к закрытому классу (пакету), особенно для теневой цели или доступа к полю или методу в миксине.
* Возможность переопределять final-методы или подклассы final-классов.
* Если вы хотите создать подкласс класса, имеющий только (пакетные) приватные конструкторы, расширители - хороший выбор.
Чтобы изменения в расширителе доступа отображались в декомпилированном исходном коде, запустите задачу gradle ''genSources'', а затем перезагрузите проект gradle в вашей IDE.
Примечание: В отличие от аксессора миксинов, расширители доступа не работают для исходников модов.
===== Требования =====
* Fabric-loader 0.8.0 или выше
* Loom 0.2.7 или выше
===== Формат файла =====
Для определения изменений доступа, включенных в ваш мод, используется специальный формат файла. Чтобы облегчить работу IDE, вам следует использовать расширение файла ''.accesswidener''.
Файл должен начинаться со следующего заголовка. ''namespace'' обычно всегда должно быть установлено слово ''named'', а не имя вашего проекта. Loom выполнит ремаппинг файла расширителя доступа в ''intermediary'' вместе с вашим модом.
accessWidener v2
**И снова, пространство имён должно быть ''named'' в большинстве, если не во всех случаях**
Файлы расширителя доступа могут содержать пустые строки и комментарии, начинающиеся с #
# Поддерживаются комментарии, подобные этому, а также в конце строки
Для разделения в файле расширителя доступа можно использовать любые пробельные символы, рекомендуется использовать табуляцию.
Имена классов разделяются символом ''/'', а не ''.''
Для внутренних классов следует использовать ''$'' вместо ''/''.
== Классы ==
Доступ к классу может быть изменён путём указания доступа и имени класса в соответствии с пространством имён маппинга, определённым в заголовке.
class
- access может быть //accessible// или //extendable//
== Методы ==
Доступ к методу может быть изменён путём указания доступа, имени класса, имени метода и дескриптора метода в соответствии с пространством имён маппинга, определённым в заголовке.
method
- access может быть //accessible// или //extendable//
- className - класс-владелец
- methodName - имя метода
- methodDesc - дескриптор метода
== Поля ==
Доступ к полю может быть изменён путём указания доступа, имени класса, имени поля и дескриптора поля в соответствии с пространством имён маппинга, определённым в заголовке.
field
- access может быть //accessible// или //mutable//
- className - класс-владелец
- fieldName - имя поля
- fieldDesc - дескриптор поля
===== Изменение доступа =====
=== Extendable ===
Extendable следует использовать, когда вы хотите расширить класс или переопределить метод.
* Классы становятся public, а final удаляется
* Методы становятся protected, а final удаляется
Если сделать метод расширяемым, то и класс станет расширяемым.
=== Accessible ===
Accessible следует использовать, когда вы хотите получить доступ к классу, полю или методу из другого класса.
* Классы становятся public
* Методы становятся public и final, если они private
* Поля становятся public
Делая метод или поле доступным, вы также делаете доступным класс.
=== Mutable ===
Mutable следует использовать, когда вы хотите изменить final-поле.
* Final-поля удалены
Если вы хотите сделать приватное final-поле одновременно доступным //и// изменяемым, вам нужно использовать две директивы, по одной на каждое изменение.
===== Указание расположения файла =====
Расположение файла расширителя доступа должно быть указано в файле build.gradle и в файле fabric.mod.json. Он должен храниться в ресурсах, так как его необходимо включить в экспортируемый jar-файл. (Замените "modid" в примере на свой собственный идентификатор мода).
Loom 0.9 или выше:
loom {
accessWidenerPath = file("src/main/resources/modid.accesswidener")
}
Loom 0.8 или ниже:
loom {
accessWidener = file("src/main/resources/modid.accesswidener")
}
fabric.mod.json:
...
"accessWidener" : "modid.accesswidener",
...
===== Проверка файла =====
По умолчанию несуществующие записи accesswidener игнорируются.
В последних версиях Loom вы можете выполнить команду ''gradlew validateAccessWidener'', чтобы проверить, что все классы, поля и методы, указанные в файле accesswidener, существуют.
Сообщения об ошибках могут быть немного загадочными. Например, если вы ошиблись в указании поля, ошибка не говорит, в чём проблема - в имени или в типе. Например, если в сообщении говорится, что не удаётся найти поле "''fooI''", это может означать, что поля с именем ''foo'' не существует, или что оно существует, но не является ''int'' (''I'').
===== V2 изменения =====
В версии v2 были добавлены ключевые слова с префиксом ''transitive-*'':
* ''transitive-accessible''
* ''transitive-extendable''
* ''transitive-mutable''
Они отличаются от своих обычных, не префиксных вариантов тем, что применяются также к модам, зависящим от этого мода.