Table of Contents
Access Wideners
Access Wideners 〔アクセスワイドナー〕は、クラス、メソッド、またはフィールドのアクセス制限を緩和する方法を提供します。 Access Wideners は、一般的に知られているアクセストランスフォーマーに似ています。
アクセサーミックスインの代わりに Access Wideners を使用することができます。現在、ミックスインによって提供される機能が十分でない場合が 2 つあります:
- 特にミックスイン内のフィールドまたはメソッドをシャドーイングまたはアクセスする目的で、(パッケージの)プライベートクラスにアクセスする必要があります。
- final メソッドをオーバーライドしたり、 final クラスを継承したりできる。
- (パッケージの)プライベートコンストラクターのみを使用してクラスをサブクラス化したい場合は、 Access Wideners が適しています。
逆コンパイルされたソースにアクセス範囲の広い変更が表示されるようにするには、 genSources
gradle タスクを実行します。
要件
- Fabric-loader 0.8.0 以降
- Loom 0.2.7 以降
ファイル形式
Mod に含まれるアクセスの変更を定義するために、特定のファイル形式が使用されます。 IDE を支援するには、 .accesswidener
ファイル拡張子を使用する必要があります。
ファイルは次のヘッダーで開始する必要があります。 namespace
は通常、常に named
である必要があります。 Loom は、 Mod とともに Access widener ファイルを intermediary
に再マップします。 カスタムの RemapJarTask
を使用する場合は、remapAccessWidener
プロパティを true
に設定して、これが確実に行われるようにします。
accessWidener v1 <namespace>
繰り返しになりますが、すべての場合ではないにしても、ほとんどの場合、名前空間に名前を付ける必要があります
Access Widener ファイルには、# で始まる空白行とコメントを含めることができます
# このようなコメントは、行末までサポートされています
Access Widener ファイルでは、任意の空白を使用して区切ることができます。タブを使用することをお勧めします。
クラス名は、 .
ではなく /
で区切ります。
内部クラスの場合、 /
の代わりに $
を使用する必要があります
クラス
クラスアクセスは、ヘッダーで定義されたマッピング名前空間に指定されたアクセスとクラス名を指定することで変更できます。
<access> class <className>
- access は accessible 〔アクセス可能〕または extendable 〔拡張可能〕にすることができます
メソッド
メソッドアクセスは、ヘッダーで定義されたマッピング名前空間に指定されているように、アクセス、クラス名、メソッド名、およびメソッド記述子を指定することによって変更できます。
<access> method <className> <methodName> <methodDesc>
- access は accessible 〔アクセス可能〕または extendable 〔拡張可能〕にすることができます
- className はクラスです
- methodName はメソッド名です
- methodDesc はメソッド記述子です
フィールド
フィールドアクセスは、ヘッダーで定義されたマッピング名前空間に指定されているように、アクセス、クラス名、フィールド名、およびフィールド記述子を指定することによって変更できます。
<access> field <className> <fieldName> <fieldDesc>
- access は accessible 〔アクセス可能〕または extendable 〔拡張可能〕にすることができます
- className はクラスです
- fieldName はフィールド名です
- fieldDesc はフィールド記述子です
アクセスの変更
拡張可能
クラスを拡張したり、メソッドをオーバーライドしたい場合は、 extendable 〔拡張可能〕を使用する必要があります。
- クラスが public になり final でなくなります
- メソッドが protected になり final でなくなります
メソッドを拡張可能にすると、クラスも拡張可能になります。
アクセス可能
別のクラスからクラス、フィールド、またはメソッドにアクセスする場合は、 accessible 〔アクセス可能〕を使用する必要があります。
- クラスが public になります
- メソッドが public になり、 private なら final になります
- フィールドが public になります
メソッドまたはフィールドをアクセス可能にすると、クラスもアクセス可能になります。
ミュータブル
final フィールドを変更する場合は Mutable を使用する必要があります
- フィールドが final でなくなります
ファイルの場所の指定
Access Widener ファイルの場所は、 build.gradle と fabric.mod.json ファイルで指定する必要があります。エクスポートされた jar ファイルに含める必要があるため、リソースに保存する必要があります。
Loom 0.9 以降:
loom { accessWidenerPath = file("src/main/resources/modid.accesswidener") }
Loom 0.8 以前:
loom { accessWidener = file("src/main/resources/modid.accesswidener") }
fabric.mod.json:
... "accessWidener" : "modid.accesswidener", ...
ファイルの検証
デフォルトでは、存在しない accesswidener エントリは無視されます。
最近のバージョンの Loom では、gradlew validateAccessWidener
を実行して、accesswidener ファイルで指定されたすべてのクラス、フィールド、およびメソッドが存在することを確認できます。