Access wideners provide a way to loosen the access limits of classes, methods or fields. Access wideners are similar to the commonly known Access Transformers.
Access wideners may be used instead of accessor mixins, and there are currently 2 cases where the functionality provided by mixin is not sufficient:
In order for access widener changes to show up in the decompiled source, run the genSources
gradle task and then reload the gradle project in your IDE.
Note: Unlike accessor mixins, access wideners do not work for source of mods.
A specific file format is used to define the access changes included in your mod. To aid IDE's you should use the .accesswidener
file extension.
The file must start with the following header. namespace
should usually always be set to the word named
, and not your project namespace. Loom will remap the access widener file for you into intermediary
along with your mod.
accessWidener v2 <namespace>
Once again, the namespace should be named
in most if not all cases
Access widener files can have blank lines and comments starting with #
# Comments like this are supported, as well as at the end of the line
Any whitespace can be used to separate in the access widener file, tab is recommended.
Class names are separated with a / and not .
For inner classes, you should use $
instead of /
Class access can be changed by specifying the access and the class name as named the mappings namespace defined in the header.
<access> class <className>
Method access can be changed by specifying the access, class name, method name and method descriptor as named the mappings namespace defined in the header.
<access> method <className> <methodName> <methodDesc>
Field access can be changed by specifying the access, class name, field name and field descriptor as named the mappings namespace defined in the header.
<access> field <className> <fieldName> <fieldDesc>
Extendable should be used where you want to extend a class or override a method.
Making a method extendable also makes the class extendable.
Accessible should be used when you want to access a class, field or method from another class.
Making a method or field accessible also makes the class accessible.
Mutable should be used when you want to mutate a final field
If you want to make a private final field both accessible and mutable, you need to use two directives, one for each change.
The access widener file location must be specified in your build.gradle and in your fabric.mod.json file. It should be stored in the resources as it needs to be included in the exported jar file. (Replace “modid” in the example with your own mod ID.)
Loom 0.9 or higher:
loom { accessWidenerPath = file("src/main/resources/modid.accesswidener") }
Loom 0.8 or lower:
loom { accessWidener = file("src/main/resources/modid.accesswidener") }
fabric.mod.json:
... "accessWidener" : "modid.accesswidener", ...
By default, accesswidener entries that don't exist are ignored.
On recent versions of Loom, you can run gradlew validateAccessWidener
to check that all the classes, fields and methods specified in the accesswidener file exist.
The error messages can be a little cryptic. For example, if you make a mistake in specifying a field, the error doesn't say whether the name or the type is the problem For example, if it says it cannot find the field “fooI
”, it could mean there is no field named foo
, or that it exists but isn't an int
(I
).
With the v2 version, the transitive-*
prefixed keywords have been added:
transitive-accessible
transitive-extendable
transitive-mutable
They differ from their regular, non-prefixed variants in that they also apply to mods that depend on this one.