インタフェースAttributeMapper<A extends Attribute<A>>
- 型パラメータ:
A- 属性の型
public interface AttributeMapper<A extends Attribute<A>>
属性の
classファイル表現とそのAPIモデルの間の双方向マッパー。 属性マッパーは、そのnameによって属性を識別し、classファイル表現をモデルに解析し、モデル表現をclassファイルに書き戻すために使用されます。
Attributesは、JVMS内の事前定義済属性のマッパーおよび特定の従来型属性を定義します。 他の属性(JVMS 4.7.1)の場合、ユーザーは独自のAttributeMapperを定義できます。これらの属性をモデル化するクラスは、CustomAttributeを拡張する必要があります。 これらの属性を読み取るには、ユーザー定義のAttributeMapperをClassFile.AttributeMapperOptionに登録する必要があります。
- 導入されたバージョン:
- 24
- 関連項目:
-
ネストされたクラスのサマリー
ネストされたクラス -
メソッドのサマリー
修飾子と型メソッド説明default booleanこの属性が1つの構造で複数回出現するかどうかを返します。name()属性の名前を返します。readAttribute(AttributedElement enclosing, ClassReader cf, int pos) クラス・ファイルAPIのclassファイルからAttributeインスタンスを作成します。classファイルに対するこの属性のデータ依存性を返します。voidwriteAttribute(BufWriter buf, A attr) Attributeインスタンスをクラス・ファイルAPIのclassファイルに書き込みます。
-
メソッドの詳細
-
name
-
readAttribute
A readAttribute(AttributedElement enclosing, ClassReader cf, int pos) クラス・ファイルAPIのclassファイルからAttributeインスタンスを作成します。このメソッドは、属性の読取りをサポートするためにクラス・ファイルAPIによってコールされます。 ユーザーは、このメソッドをコールしないでください。
Class-File APIは、このメソッドへの呼び出しに関して次の約束を行います:
- 属性の名前の
Utf8Entryには、cf.readEntry(pos - 6, Utf8Entry.class)を使用してアクセスでき、検証されます - 属性の長さは
cf.readInt(pos - 4)でアクセスでき、classファイルの長さを超えない正であることが検証されます enclosingモデルのAttributedElement属性アクセス機能は、このメソッドがコールされるときにはアクセスできませんが、後で戻された属性からユーザーがアクセスできるときにアクセスできます。
返される
Attributeは、次の要件を満たす必要があります:Attribute.attributeMapper()はこのマッパーを返しますAttribute.attributeName()は、classファイル内の属性名を返します。
- APIのノート:
- このメソッドの実装では、結果の属性が使用されない場合でもこのメソッドが呼び出されるため、属性を戻すための最小限の作業を実行する必要があります。 特に、実装では、属性
classファイル・データの有効性をチェックしたり、例外をスローする可能性のあるアクションを実行しないようにする必要があります。 - パラメータ:
enclosing- この属性が表示される構造cf- 読取り元のclassファイルへのアクセスを提供pos- 属性の内容が開始されるclassファイルへのオフセット- 戻り値:
- read属性
- 属性の名前の
-
writeAttribute
Attributeインスタンスをクラス・ファイルAPIのclassファイルに書き込みます。このメソッドは、属性の書込みをサポートするためにClass-File APIによってコールされます。 ユーザーは、このメソッドをコールしないでください。
Class-File APIは、このメソッドへの呼び出しに関して次の約束を行います:
attr.attributeMapper()はこのマッパーを返しますbufのsizeが0でない可能性があるため、すでにデータが書き込まれている可能性があります。
classファイルの書込みは、次の要件を満たす必要があります:- 属性名
u2および属性長u4は、bufに書き込む必要があります attr.attributeName()は、buf.writeIndex(attr.attributeName())のように書き込まれます- 属性の長さは、
bufに書き込まれる属性内容の長さ(バイト単位)で、名前と長さによって使用される6バイトは含まれません - 属性
attrのAPIモデル内の情報を属性のclassファイル形式で表すことができない場合は、IllegalArgumentExceptionがスローされます。
- APIのノート:
BufWriter.patchInt(int, int, int)を使用して、属性の内容がbufに書き込まれた後の属性長を更新できます。- パラメータ:
buf- 属性の書込み先となるBufWriterattr- 書き込む属性- スロー:
IllegalArgumentException- 属性のAPIモデルの一部のデータがclassファイル形式に対して無効な場合
-
allowMultiple
default boolean allowMultiple()この属性が1つの構造で複数回出現するかどうかを返します。1つの属性で1つの構造内の複数のインスタンスを許可せず、
ClassFileBuilderに指定でき、その属性の複数のインスタンスがビルダーに指定されている場合、最後に指定された属性がビルド構造に表示されます。- 実装要件:
- デフォルトの実装では
falseを返します。 - 戻り値:
- この属性が1つの構造で複数回出現するかどうか
-
stability
AttributeMapper.AttributeStability stability()classファイルに対するこの属性のデータ依存性を返します。- 戻り値:
classファイルに対するこの属性のデータ依存性
-