User Tools

Site Tools


zh_cn:tutorial:accesswideners

访问加宽

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

访问加宽可代替 Mixin。目前有以下两种情景 Mixin 无法做到:

  • 需要访问 package 或 private 级别的类,尤其是为了 @Shadow 修饰(shadowing)或访问 Mixin 里的字段或方法。
  • 需要重写使用 final 修饰的子类,或将其子类化。
    • 如果你想用 package 或 private 级别的构造函数子类化类,使用访问加宽是个不错的选择。

为了让访问加宽造成的的变化显示在反编译后的源代码中,请运行 genSources Gradle 任务,然后在 IDE 中重新加载 Gradle 项目。

注意:与 Mixin 访问器不同,访问加宽不适用于模组的源代码。

需求

  • Fabric-loader 0.8.0 或更高
  • Loom 0.2.7 或更高

文件格式

需要在您的模组里使用特定的文件格式,来声明访问权限修改。为了帮助 IDE,您应该使用 .accesswidener 文件扩展名。

该文件首行应该遵循下述格式,命名空间 应该始终设置为 named,而不是模组的命名空间。Loom 将会重新映射模组和访问加宽文件到中间名。

accessWidener v2 <命名空间>

再次强调,命名空间在绝大多数情况下应该是 named

访问加宽文件允许使用空行和和以 # 开头的注释。

# 这样的注释和行尾注释都是支持的。

任何空格都可作为访问加宽文件的分隔符,推荐制表符 tab。

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

对于内部类,应该使用 $ 而不是 /

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

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

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

<访问权限>   method   <类名>   <方法名>   <方法描述符>
  1. 访问权限可以是 accessibleextendable
  2. 类名是拥有该方法的类
字段

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

<访问权限>   field   <类名>   <字段名>   <字段描述符>
  1. 访问权限可以是 accessiblemutable
  2. 类名是拥有该字段的类

访问权限修改

Extendable(可继承)

需要继承类或者重写方法时,用 extendable。

  • 类将变为 public 并移除 final 修饰符
  • 方法将变为 protected 并移除 final 修饰符

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

Accessible(可访问)

需要访问另一个类及其字段和方法时,用 accessible。

  • 类将变为 public
  • 方法将变为 public,且 private 方法将用 final 修饰
  • 字段将会变为 public

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

Mutable(可修改)

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

  • 字段将会移除 final 修饰符

若想让一个 private final 字段既 accessible 又 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. ...

验证文件

默认情况下,不存在的访问加宽条目将被忽略。 在 Loom 的最新版本中,您可以运行 gradlew validAccessWidener 来检查访问加宽文件中指定的所有类、字段和方法是否存在。

错误消息可能有点隐晦。例如,如果您在指定字段时犯了错误,错误不会说明问题是字段名称还是类型。例如,如果它说找不到字段 “fooI”,则可能意味着没有名为 foo 的字段,或者它存在但不是 int (I)。

V2 更改

在访问加宽 v2 版本中,添加了以 transitive-* 为前缀的关键字:

  • transitive-accessible
  • transitive-extendable
  • transitive-mutable

它们与常规的、无前缀的变体不同,但它们也适用于依赖于此的模组。

zh_cn/tutorial/accesswideners.txt · Last modified: 2024/08/12 04:11 by jeffreyg1228