0

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中呢?以及产生它的方法是什么?

提前致谢!

4

0 回答 0