0

この議論が示すように、Java はプリミティブ、String、Enum、Array、および Annotation のみをアノテーション メンバー タイプとしてサポートしているようです:
Java アノテーション メンバーに使用できるタイプ

ただし、Android アート ランタイムでは、注釈を処理するときにFieldサポートされるタイプがあります。Art はフィールド インデックスを読み取り、対応するオブジェクトを作成します。コードは次のとおりです。

// $ANDROID_ROOT/art/runtime/dex/dex_file_annotations.cc
template <bool kTransactionActive>
bool ProcessAnnotationValue(const ClassData& klass,
                            const uint8_t** annotation_ptr,
                            DexFile::AnnotationValue* annotation_value,
                            Handle<mirror::Class> array_class,
                            DexFile::AnnotationResultStyle result_style)
    REQUIRES_SHARED(Locks::mutator_lock_) {

    // ... OTHER CODES
    case DexFile::kDexAnnotationField: {
      uint32_t index = DexFile::ReadUnsignedInt(annotation, value_arg, false);
      if (result_style == DexFile::kAllRaw) {
        annotation_value->value_.SetI(index);
      } else {
        StackHandleScope<2> hs(self);
        ArtField* field = Runtime::Current()->GetClassLinker()->ResolveFieldJLS(
            index,
            hs.NewHandle(klass.GetDexCache()),
            hs.NewHandle(klass.GetClassLoader()));
        if (field == nullptr) {
          return false;
        }
        set_object = true;
        element_object = mirror::Field::CreateFromArtField(self, field, true);
        if (element_object == nullptr) {
          return false;
        }
      }
      break;
    }
    // ... OTHER CODES
}

JavaFieldは注釈メンバー型としてサポートしていないため、どのシナリオFieldで dex の注釈メンバー型として表示されますか? また、その製造方法は何ですか?

前もって感謝します!

4

0 に答える 0