Table of Contents

访问加宽

访问加宽(Access wideners)提供了一种放宽类、方法、字段访问权限的方式。访问加宽类似于著名的 Access Transformers.

访问加宽应该仅在使用 Mixin 无法实现时使用。目前只有以下两种情景 Mixin 无法做到:

为了让 access widener 造成的的变化显示在反编译的源代码中,请运行 genSources gradle任务。

需求

文件格式

需要在你的模组里包含一个声明修改访问权限的特殊文件,为了帮助,你应该在IDE中使用 .accesswidener 文件扩展名。

该文件首行应该遵循下述格式,命名空间 应该与你模组源码使用混淆命名空间匹配,通常是 named。 Loom 将会为你重新映射 access widener 文件,使其更改为 intermediary。如果你使用自定义的 RemapJarTask,设置 remapAccessWidenertrue 来确保上述行为发生。

accessWidener	v1	<命名空间>

再次提醒,命名空间应该在你使用 yarn 命名时设置为 named, 使用中间名命名时设置为 intermediary

Access widener 文件允许使用空行和和以 # 开头的注释。

# 这样的注释是支持的,当它被放在行尾也是这样的

任何空白字符都作为 access widener 文件的分隔符,推荐制表符 tab。

类名应该使用 / 分隔,而不是 .

对于内部类,你应该使用 $ 来代替 /

类的访问权限可以通过指定 访问权 和 类的名称 来改变,就像第一行定义命名空间那样。

<访问权>   class   <类名>
  1. 访问权可以是 accessibleextendable
方法

可以通过指定访问权限、类名称、方法名称和方法描述符来改变方法访问权,就像上面定义的映射命名空间一样。

<access>   method   <className>   <methodName>   <methodDesc>
  1. access 可以是 accessibleextendable
  2. classname 是拥有者类
  3. methodName 是方法名称
  4. methodDesc 是方法描述符
字段

字段的访问权可以通过指定访问权、类名称、字段名称和字段描述符来修改,就像上面定义的映射命名空间一样。

<access>   field   <className>   <fieldName>   <fieldDesc>
  1. access 可以是 accessiblemutable
  2. className 是拥有者类
  3. fieldName 是字段名称
  4. fieldDesc 是字段描述符

访问权变更

Extendable(可继承)

需要继承最终类或者覆盖最终方法时,用 extendable。

将方法改为 extendable 的同时也会使类变为 extendable。

Accessible(可访问)

需要访问另一个类的类、字段或方法时,用 accessible。

将方法或者字段改为 accessible 将会使得类也 accessible。

Mutable(可修改)

需要修改常量字段时,用 mutable。

指定文件位置

访问加宽文件位置必须在 build.gradle 和 fabric.mod.json 文件中指定。该文件应该存在 resources 中,且需要包括在导出的 jar 文件中。

Loom 0.9 或更高版本:

  1. loom {
  2. accessWidenerPath = file("src/main/resources/modid.accesswidener")
  3. }

Loom 0.8 或更低版本:

  1. loom {
  2. accessWidener = file("src/main/resources/modid.accesswidener")
  3. }

fabric.mod.json:

  1. ...
  2.  
  3. "accessWidener" : "modid.accesswidener",
  4.  
  5. ...