Difference between revisions of "Access Transformers"

From Forge Community Wiki
(Add under construction header)
(Update to 1.17)
Line 5: Line 5:
 
== Visibility ==
 
== Visibility ==
  
Here's a quick rundown of the visibility options offered by Java 8:
+
Here's a quick rundown of the visibility options offered by Java 16:
  
 
* <code>public</code> visible to all classes inside and outside its package
 
* <code>public</code> visible to all classes inside and outside its package
Line 22: Line 22:
 
A random example to understand the syntax:
 
A random example to understand the syntax:
  
<code ->public net.minecraft.util.palette.IResizeCallback # makes IResizeCallback public</code>
+
<code ->public net.minecraft.world.level.chunk.PaletteResize # makes PaletteResize public</code>
  
 
If a valid entry is found on a line, Forge will look into the bytecode of the file where that member is defined, and change its access to whatever you desire it to be.
 
If a valid entry is found on a line, Forge will look into the bytecode of the file where that member is defined, and change its access to whatever you desire it to be.
Line 33: Line 33:
 
An example of this in place:
 
An example of this in place:
  
<code ->public-f net.minecraft.util.palette.IResizeCallback # makes IResizeCallback public</code>
+
<code ->public-f net.minecraft.world.level.chunk.PaletteResize # makes PaletteResize public</code>
  
 
Note: You can also use this to ''add'' a final keyword via <code>+f</code>. This is never recommended however, and should be avoided at all costs unless absolutely necessary.
 
Note: You can also use this to ''add'' a final keyword via <code>+f</code>. This is never recommended however, and should be avoided at all costs unless absolutely necessary.

Revision as of 22:32, 2 August 2021

This page is under construction.

This page is incomplete, and needs more work. Feel free to edit and improve this page!

Access Transformers are Forge's native way of allowing you to access (read and write) functions that have a lower-than-ideal visibility, and/or removing finality.

Visibility

Here's a quick rundown of the visibility options offered by Java 16:

  • public visible to all classes inside and outside its package
  • protected visible only to classes inside the package and subclasses
  • default visible only to classes inside the package
  • private visible only to inside the class

Additionally, there are final variants of each of these, each represented by the phrase "-f" on the end of the access specifier.

How It Works

As Forge is loading, it scans the jar file for the META-INF/accesstransformers.cfg file. if it's found, it is parsed according to the specification:

NewAccessSpecifier MemberSignature # comment

A random example to understand the syntax:

public net.minecraft.world.level.chunk.PaletteResize # makes PaletteResize public

If a valid entry is found on a line, Forge will look into the bytecode of the file where that member is defined, and change its access to whatever you desire it to be.

This startup modification means accessing is O(1) for all accesses after this initial change, which makes it a great option for performance if you're looking at something a lot

Removing Finality

Access transformers can also be used to remove the final keyword on code elements. To do this, append -f to the access specifier.

An example of this in place:

public-f net.minecraft.world.level.chunk.PaletteResize # makes PaletteResize public

Note: You can also use this to add a final keyword via +f. This is never recommended however, and should be avoided at all costs unless absolutely necessary.

Using Access Transformers in your mod

Important

You should avoid using ATs if a private variable / function you're looking at has a getter or a setter. Variables are usually private for a reason.


Step 1: Uncomment the access transformer line in your build.gradle

Access-transformers-uncomment-this-line-in-build-gradle.png

Step 2: Create a new file called "accesstransformer.cfg" in the src/main/resources/META-INF/ folder.

Step 3: Refresh the Gradle project. This can be done natively in IDEA and Eclipse.

When not to use Access Transformers

  • Unnecessary access transformations (e.g. using ATs to make something public when it's already public)