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:13] – [Specifying file location] 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 是字段描述符 | + | |
- | ===== 访问权变更 | + | ===== 访问权限修改 |
=== Extendable(可继承) === | === Extendable(可继承) === | ||
- | 需要继承最终类或者覆盖最终方法时,用 extendable。 | + | 需要继承类或者重写方法时,用 extendable。 |
- | * 类将会改成 | + | * 类将变为 |
- | * 方法会改成 | + | * 方法将变为 |
将方法改为 extendable 的同时也会使类变为 extendable。 | 将方法改为 extendable 的同时也会使类变为 extendable。 | ||
Line 88: | Line 84: | ||
=== Accessible(可访问) === | === Accessible(可访问) === | ||
- | 需要访问另一个类的类、字段或方法时,用 accessible。 | + | 需要访问另一个类及其字段和方法时,用 accessible。 |
* 类将变为 public | * 类将变为 public | ||
- | * 方法将变为 public,并且若为 | + | * 方法将变为 public,且 private |
* 字段将会变为 public | * 字段将会变为 public | ||
Line 101: | Line 97: | ||
* 字段将会移除 final 修饰符 | * 字段将会移除 final 修饰符 | ||
+ | |||
+ | 若想让一个 private final 字段既 accessible 又 mutable,需要两条指令。 | ||
===== 指定文件位置 ===== | ===== 指定文件位置 ===== | ||
Line 131: | Line 129: | ||
... | ... | ||
</ | </ | ||
+ | |||
+ | ===== 验证文件 ===== | ||
+ | 默认情况下,不存在的访问加宽条目将被忽略。 | ||
+ | 在 Loom 的最新版本中,您可以运行 '' | ||
+ | |||
+ | 错误消息可能有点隐晦。例如,如果您在指定字段时犯了错误,错误不会说明问题是字段名称还是类型。例如,如果它说找不到字段 “'' | ||
+ | |||
+ | ===== V2 更改 ===== | ||
+ | |||
+ | 在访问加宽 v2 版本中,添加了以 '' | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | 它们与常规的、无前缀的变体不同,但它们也适用于依赖于此的模组。 |
zh_cn/tutorial/accesswideners.1635156793.txt.gz · Last modified: 2021/10/25 10:13 by solidblock