インタフェース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を拡張する必要があります。 これらの属性を読み取るには、ユーザー定義のAttributeMapperClassFile.AttributeMapperOptionに登録する必要があります。

導入されたバージョン:
24
関連項目:
  • ネストされたクラスのサマリー

    ネストされたクラス
    修飾子と型
    インタフェース
    説明
    static enum 
    属性のclassファイル表現のデータ依存性を示します。
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    default boolean
    この属性が1つの構造で複数回出現するかどうかを返します。
    属性の名前を返します。
    readAttribute(AttributedElement enclosing, ClassReader cf, int pos)
    クラス・ファイルAPIのclassファイルからAttributeインスタンスを作成します。
    classファイルに対するこの属性のデータ依存性を返します。
    void
    Attributeインスタンスをクラス・ファイルAPIのclassファイルに書き込みます。
  • メソッドの詳細

    • name

      String 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は、次の要件を満たす必要があります:

      APIのノート:
      このメソッドの実装では、結果の属性が使用されない場合でもこのメソッドが呼び出されるため、属性を戻すための最小限の作業を実行する必要があります。 特に、実装では、属性classファイル・データの有効性をチェックしたり、例外をスローする可能性のあるアクションを実行しないようにする必要があります。
      パラメータ:
      enclosing - この属性が表示される構造
      cf - 読取り元のclassファイルへのアクセスを提供
      pos - 属性の内容が開始されるclassファイルへのオフセット
      戻り値:
      read属性
    • writeAttribute

      void writeAttribute(BufWriter buf, A attr)
      Attributeインスタンスをクラス・ファイルAPIのclassファイルに書き込みます。

      このメソッドは、属性の書込みをサポートするためにClass-File APIによってコールされます。 ユーザーは、このメソッドをコールしないでください。

      Class-File APIは、このメソッドへの呼び出しに関して次の約束を行います:

      • attr.attributeMapper()はこのマッパーを返します
      • bufsize0でない可能性があるため、すでにデータが書き込まれている可能性があります。

      classファイルの書込みは、次の要件を満たす必要があります:

      • 属性名u2および属性長u4は、bufに書き込む必要があります
      • attr.attributeName()は、buf.writeIndex(attr.attributeName())のように書き込まれます
      • 属性の長さは、bufに書き込まれる属性内容の長さ(バイト単位)で、名前と長さによって使用される6バイトは含まれません
      • 属性attrのAPIモデル内の情報を属性のclassファイル形式で表すことができない場合は、IllegalArgumentExceptionがスローされます。

      APIのノート:
      BufWriter.patchInt(int, int, int)を使用して、属性の内容がbufに書き込まれた後の属性長を更新できます。
      パラメータ:
      buf - 属性の書込み先となるBufWriter
      attr - 書き込む属性
      スロー:
      IllegalArgumentException - 属性のAPIモデルの一部のデータがclassファイル形式に対して無効な場合
    • allowMultiple

      default boolean allowMultiple()
      この属性が1つの構造で複数回出現するかどうかを返します。

      1つの属性で1つの構造内の複数のインスタンスを許可せず、ClassFileBuilderに指定でき、その属性の複数のインスタンスがビルダーに指定されている場合、最後に指定された属性がビルド構造に表示されます。

      実装要件:
      デフォルトの実装ではfalseを返します。
      戻り値:
      この属性が1つの構造で複数回出現するかどうか
    • stability

      classファイルに対するこの属性のデータ依存性を返します。
      戻り値:
      classファイルに対するこの属性のデータ依存性