Java 似乎只支持原语、String、Enum、Array 和 Annotation 作为注释成员类型,如本讨论所示:
哪些类型可用于 java 注释成员
然而在 android art runtime 中,当处理 anntations 时,有一个类型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
}
由于java不支持Field
作为注解成员类型,那么在什么情况下会Field
作为注解成员类型出现在dex中呢?以及产生它的方法是什么?
提前致谢!