この議論が示すように、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 の注釈メンバー型として表示されますか? また、その製造方法は何ですか?
前もって感謝します!