zh_cn:tutorial:accesswideners
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:accesswideners [2021/10/25 10:05] – [文件格式] solidblock | zh_cn:tutorial:accesswideners [2024/08/12 04:11] (current) – jeffreyg1228 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
- | Access wideners(访问加宽)提供了一种放宽类、方法、字段访问权限的方式。Access wideners | + | 访问加宽(Access wideners)提供了一种放宽类、方法、字段访问权限的方式。访问加宽类似于著名的 Access Transformers。 |
- | Access wideners 应该**仅在**使用 | + | 访问加宽可代替 |
- | * 需要访问一个(包内)的私有类,尤其是为了 @Shadow 修饰或在 Mixin 类内访问一个字段或方法。 | + | * 需要访问 |
- | * 需要重写使用 final 修饰的子类。 | + | * 需要重写使用 final 修饰的子类,或将其子类化。 |
- | * 在你考虑重写使用 final 修饰的方法之前,使用注入器等方法修改。 | + | * 如果你想用 package 或 private 级别的构造函数子类化类,使用访问加宽是个不错的选择。 |
- | * 如果你想为一个包含私有构造方法的类创建子类,wideners | + | |
- | 为了让 | + | 为了让访问加宽造成的的变化显示在反编译后的源代码中,请运行 '' |
+ | |||
+ | 注意:与 Mixin 访问器不同,访问加宽不适用于模组的源代码。 | ||
===== 需求 ===== | ===== 需求 ===== | ||
Line 16: | Line 17: | ||
===== 文件格式 ===== | ===== 文件格式 ===== | ||
+ | 需要在您的模组里使用特定的文件格式,来声明访问权限修改。为了帮助 IDE,您应该使用 '' | ||
- | 需要在你的模组里包含一个声明修改访问权限的特殊文件,为了帮助,你应该在IDE中使用 '' | + | 该文件首行应该遵循下述格式,'' |
- | + | ||
- | 该文件首行应该遵循下述格式,'' | + | |
<code [enable_line_numbers=" | <code [enable_line_numbers=" | ||
- | accessWidener v1 < | + | accessWidener |
</ | </ | ||
- | **再次提醒,命名空间应该在你使用 yarn 命名时设置为 | + | **再次强调,命名空间在绝大多数情况下应该是 '' |
- | Access widener | + | 访问加宽文件允许使用空行和和以 # 开头的注释。 |
<code [enable_line_numbers=" | <code [enable_line_numbers=" | ||
- | # 这样的注释是支持的,当它被放在行尾也是这样的 | + | # 这样的注释和行尾注释都是支持的。 |
</ | </ | ||
- | 任何空白字符都作为 | + | 任何空格都可作为访问加宽文件的分隔符,推荐制表符 tab。 |
类名应该使用 / 分隔,而不是 . | 类名应该使用 / 分隔,而不是 . | ||
- | 对于内部类,你应该使用 '' | + | 对于内部类,应该使用 '' |
== 类 == | == 类 == | ||
- | 类的访问权限可以通过指定 访问权 和 类的名称 来改变,就像第一行定义命名空间那样。 | + | 类的访问权限可以通过指定访问权限和类名来改变,就像第一行定义命名空间那样。 |
<code [enable_line_numbers=" | <code [enable_line_numbers=" | ||
- | < | + | < |
</ | </ | ||
- | - 访问权可以是 // | + | - 访问权限可以是 // |
== 方法 == | == 方法 == | ||
- | 可以通过指定访问权限、类名称、方法名称和方法描述符来改变方法访问权,就像上面定义的映射命名空间一样。 | + | 可以通过指定访问权限、类名、方法名称和方法描述符来改变方法访问权,就像上面定义的映射命名空间一样。 |
<code [enable_line_numbers=" | <code [enable_line_numbers=" | ||
- | <access> | + | <访问权限> |
</ | </ | ||
- | - access | + | - 访问权限可以是 // |
- | - classname | + | - 类名是拥有该方法的类 |
- | - methodName 是方法名称 | + | |
- | - methodDesc 是方法描述符 | + | |
== 字段 == | == 字段 == | ||
- | 字段的访问权可以通过指定访问权、类名称、字段名称和字段描述符来修改,就像上面定义的映射命名空间一样。 | + | 字段的访问权可以通过指定访问权限、类名、字段名称和字段描述符来修改,就像上面定义的映射命名空间一样。 |
<code [enable_line_numbers=" | <code [enable_line_numbers=" | ||
- | <access> | + | <访问权限> |
</ | </ | ||
- | - access | + | - 访问权限可以是 // |
- | - className | + | - 类名是拥有该字段的类 |
- | - fieldName 是字段名称 | + | |
- | - fieldDesc 是字段描述符 | + | |
- | ===== Access Changes | + | ===== 访问权限修改 |
- | === Extendable === | + | === Extendable(可继承) |
- | Extendable should be used where you want to extend a class or override a method. | + | 需要继承类或者重写方法时,用 extendable。 |
- | * Classes are made public | + | * 类将变为 |
- | * Methods are made protected | + | * 方法将变为 |
- | Making a method | + | 将方法改为 |
- | === Accessible === | + | === Accessible(可访问) |
- | Accessible should be used when you want to access a class, field or method from another class. | + | 需要访问另一个类及其字段和方法时,用 accessible。 |
- | * Classes are made public | + | * 类将变为 |
- | * Methods are made public | + | * 方法将变为 |
- | * Fields are made public | + | * 字段将会变为 |
- | Making a method or field accessible | + | 将方法或者字段改为 |
- | === Mutable === | + | === Mutable(可修改) |
- | Mutable should be used when you want to mutate a final field | + | 需要修改常量字段时,用 mutable。 |
- | * Fields have final removed | + | * 字段将会移除 |
- | ===== Specifying file location ===== | + | 若想让一个 private final 字段既 accessible 又 mutable,需要两条指令。 |
- | 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. | + | ===== 指定文件位置 ===== |
- | Loom 0.9 or higher: | + | 访问加宽文件位置必须在 build.gradle 和 fabric.mod.json 文件中指定。该文件应该存在 resources 中,且需要包括在导出的 jar 文件中。 |
+ | |||
+ | Loom 0.9 或更高版本: | ||
<code groovy [enable_line_numbers=" | <code groovy [enable_line_numbers=" | ||
Line 114: | Line 112: | ||
</ | </ | ||
- | Loom 0.8 or lower: | + | Loom 0.8 或更低版本: |
<code groovy [enable_line_numbers=" | <code groovy [enable_line_numbers=" | ||
Line 122: | Line 120: | ||
</ | </ | ||
- | fabric.mod.json: | + | fabric.mod.json: |
<code json [enable_line_numbers=" | <code json [enable_line_numbers=" | ||
Line 131: | Line 129: | ||
... | ... | ||
</ | </ | ||
+ | |||
+ | ===== 验证文件 ===== | ||
+ | 默认情况下,不存在的访问加宽条目将被忽略。 | ||
+ | 在 Loom 的最新版本中,您可以运行 '' | ||
+ | |||
+ | 错误消息可能有点隐晦。例如,如果您在指定字段时犯了错误,错误不会说明问题是字段名称还是类型。例如,如果它说找不到字段 “'' | ||
+ | |||
+ | ===== V2 更改 ===== | ||
+ | |||
+ | 在访问加宽 v2 版本中,添加了以 '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | 它们与常规的、无前缀的变体不同,但它们也适用于依赖于此的模组。 |
zh_cn/tutorial/accesswideners.1635156335.txt.gz · Last modified: 2021/10/25 10:05 by solidblock