Home | History | Annotate | Download | only in native
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "java_lang_Class.h"
     18 
     19 #include <iostream>
     20 
     21 #include "art_field-inl.h"
     22 #include "art_method-inl.h"
     23 #include "base/enums.h"
     24 #include "class_linker-inl.h"
     25 #include "common_throws.h"
     26 #include "dex_file-inl.h"
     27 #include "dex_file_annotations.h"
     28 #include "jni_internal.h"
     29 #include "mirror/class-inl.h"
     30 #include "mirror/class_loader.h"
     31 #include "mirror/field-inl.h"
     32 #include "mirror/method.h"
     33 #include "mirror/object-inl.h"
     34 #include "mirror/object_array-inl.h"
     35 #include "mirror/string-inl.h"
     36 #include "native_util.h"
     37 #include "nativehelper/jni_macros.h"
     38 #include "nativehelper/ScopedLocalRef.h"
     39 #include "nativehelper/ScopedUtfChars.h"
     40 #include "nth_caller_visitor.h"
     41 #include "obj_ptr-inl.h"
     42 #include "reflection.h"
     43 #include "scoped_fast_native_object_access-inl.h"
     44 #include "scoped_thread_state_change-inl.h"
     45 #include "utf.h"
     46 #include "well_known_classes.h"
     47 
     48 namespace art {
     49 
     50 ALWAYS_INLINE static inline ObjPtr<mirror::Class> DecodeClass(
     51     const ScopedFastNativeObjectAccess& soa, jobject java_class)
     52     REQUIRES_SHARED(Locks::mutator_lock_) {
     53   ObjPtr<mirror::Class> c = soa.Decode<mirror::Class>(java_class);
     54   DCHECK(c != nullptr);
     55   DCHECK(c->IsClass());
     56   // TODO: we could EnsureInitialized here, rather than on every reflective get/set or invoke .
     57   // For now, we conservatively preserve the old dalvik behavior. A quick "IsInitialized" check
     58   // every time probably doesn't make much difference to reflection performance anyway.
     59   return c;
     60 }
     61 
     62 // "name" is in "binary name" format, e.g. "dalvik.system.Debug$1".
     63 static jclass Class_classForName(JNIEnv* env, jclass, jstring javaName, jboolean initialize,
     64                                  jobject javaLoader) {
     65   ScopedFastNativeObjectAccess soa(env);
     66   ScopedUtfChars name(env, javaName);
     67   if (name.c_str() == nullptr) {
     68     return nullptr;
     69   }
     70 
     71   // We need to validate and convert the name (from x.y.z to x/y/z).  This
     72   // is especially handy for array types, since we want to avoid
     73   // auto-generating bogus array classes.
     74   if (!IsValidBinaryClassName(name.c_str())) {
     75     soa.Self()->ThrowNewExceptionF("Ljava/lang/ClassNotFoundException;",
     76                                    "Invalid name: %s", name.c_str());
     77     return nullptr;
     78   }
     79 
     80   std::string descriptor(DotToDescriptor(name.c_str()));
     81   StackHandleScope<2> hs(soa.Self());
     82   Handle<mirror::ClassLoader> class_loader(
     83       hs.NewHandle(soa.Decode<mirror::ClassLoader>(javaLoader)));
     84   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
     85   Handle<mirror::Class> c(
     86       hs.NewHandle(class_linker->FindClass(soa.Self(), descriptor.c_str(), class_loader)));
     87   if (c == nullptr) {
     88     ScopedLocalRef<jthrowable> cause(env, env->ExceptionOccurred());
     89     env->ExceptionClear();
     90     jthrowable cnfe = reinterpret_cast<jthrowable>(
     91         env->NewObject(WellKnownClasses::java_lang_ClassNotFoundException,
     92                        WellKnownClasses::java_lang_ClassNotFoundException_init,
     93                        javaName,
     94                        cause.get()));
     95     if (cnfe != nullptr) {
     96       // Make sure allocation didn't fail with an OOME.
     97       env->Throw(cnfe);
     98     }
     99     return nullptr;
    100   }
    101   if (initialize) {
    102     class_linker->EnsureInitialized(soa.Self(), c, true, true);
    103   }
    104   return soa.AddLocalReference<jclass>(c.Get());
    105 }
    106 
    107 static jstring Class_getNameNative(JNIEnv* env, jobject javaThis) {
    108   ScopedFastNativeObjectAccess soa(env);
    109   StackHandleScope<1> hs(soa.Self());
    110   ObjPtr<mirror::Class> c = DecodeClass(soa, javaThis);
    111   return soa.AddLocalReference<jstring>(mirror::Class::ComputeName(hs.NewHandle(c)));
    112 }
    113 
    114 // TODO: Move this to mirror::Class ? Other mirror types that commonly appear
    115 // as arrays have a GetArrayClass() method.
    116 static ObjPtr<mirror::Class> GetClassArrayClass(Thread* self)
    117     REQUIRES_SHARED(Locks::mutator_lock_) {
    118   ObjPtr<mirror::Class> class_class = mirror::Class::GetJavaLangClass();
    119   return Runtime::Current()->GetClassLinker()->FindArrayClass(self, &class_class);
    120 }
    121 
    122 static jobjectArray Class_getInterfacesInternal(JNIEnv* env, jobject javaThis) {
    123   ScopedFastNativeObjectAccess soa(env);
    124   StackHandleScope<4> hs(soa.Self());
    125   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
    126 
    127   if (klass->IsProxyClass()) {
    128     return soa.AddLocalReference<jobjectArray>(klass->GetProxyInterfaces()->Clone(soa.Self()));
    129   }
    130 
    131   const DexFile::TypeList* iface_list = klass->GetInterfaceTypeList();
    132   if (iface_list == nullptr) {
    133     return nullptr;
    134   }
    135 
    136   const uint32_t num_ifaces = iface_list->Size();
    137   Handle<mirror::Class> class_array_class = hs.NewHandle(GetClassArrayClass(soa.Self()));
    138   Handle<mirror::ObjectArray<mirror::Class>> ifaces = hs.NewHandle(
    139       mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class.Get(), num_ifaces));
    140   if (ifaces.IsNull()) {
    141     DCHECK(soa.Self()->IsExceptionPending());
    142     return nullptr;
    143   }
    144 
    145   // Check that we aren't in an active transaction, we call SetWithoutChecks
    146   // with kActiveTransaction == false.
    147   DCHECK(!Runtime::Current()->IsActiveTransaction());
    148 
    149   MutableHandle<mirror::Class> interface(hs.NewHandle<mirror::Class>(nullptr));
    150   for (uint32_t i = 0; i < num_ifaces; ++i) {
    151     const dex::TypeIndex type_idx = iface_list->GetTypeItem(i).type_idx_;
    152     interface.Assign(ClassLinker::LookupResolvedType(
    153         type_idx, klass->GetDexCache(), klass->GetClassLoader()));
    154     ifaces->SetWithoutChecks<false>(i, interface.Get());
    155   }
    156 
    157   return soa.AddLocalReference<jobjectArray>(ifaces.Get());
    158 }
    159 
    160 static mirror::ObjectArray<mirror::Field>* GetDeclaredFields(
    161     Thread* self, ObjPtr<mirror::Class> klass, bool public_only, bool force_resolve)
    162       REQUIRES_SHARED(Locks::mutator_lock_) {
    163   StackHandleScope<1> hs(self);
    164   IterationRange<StrideIterator<ArtField>> ifields = klass->GetIFields();
    165   IterationRange<StrideIterator<ArtField>> sfields = klass->GetSFields();
    166   size_t array_size = klass->NumInstanceFields() + klass->NumStaticFields();
    167   if (public_only) {
    168     // Lets go subtract all the non public fields.
    169     for (ArtField& field : ifields) {
    170       if (!field.IsPublic()) {
    171         --array_size;
    172       }
    173     }
    174     for (ArtField& field : sfields) {
    175       if (!field.IsPublic()) {
    176         --array_size;
    177       }
    178     }
    179   }
    180   size_t array_idx = 0;
    181   auto object_array = hs.NewHandle(mirror::ObjectArray<mirror::Field>::Alloc(
    182       self, mirror::Field::ArrayClass(), array_size));
    183   if (object_array == nullptr) {
    184     return nullptr;
    185   }
    186   for (ArtField& field : ifields) {
    187     if (!public_only || field.IsPublic()) {
    188       auto* reflect_field = mirror::Field::CreateFromArtField<kRuntimePointerSize>(self,
    189                                                                                    &field,
    190                                                                                    force_resolve);
    191       if (reflect_field == nullptr) {
    192         if (kIsDebugBuild) {
    193           self->AssertPendingException();
    194         }
    195         // Maybe null due to OOME or type resolving exception.
    196         return nullptr;
    197       }
    198       object_array->SetWithoutChecks<false>(array_idx++, reflect_field);
    199     }
    200   }
    201   for (ArtField& field : sfields) {
    202     if (!public_only || field.IsPublic()) {
    203       auto* reflect_field = mirror::Field::CreateFromArtField<kRuntimePointerSize>(self,
    204                                                                                    &field,
    205                                                                                    force_resolve);
    206       if (reflect_field == nullptr) {
    207         if (kIsDebugBuild) {
    208           self->AssertPendingException();
    209         }
    210         return nullptr;
    211       }
    212       object_array->SetWithoutChecks<false>(array_idx++, reflect_field);
    213     }
    214   }
    215   DCHECK_EQ(array_idx, array_size);
    216   return object_array.Get();
    217 }
    218 
    219 static jobjectArray Class_getDeclaredFieldsUnchecked(JNIEnv* env, jobject javaThis,
    220                                                      jboolean publicOnly) {
    221   ScopedFastNativeObjectAccess soa(env);
    222   return soa.AddLocalReference<jobjectArray>(
    223       GetDeclaredFields(soa.Self(), DecodeClass(soa, javaThis), publicOnly != JNI_FALSE, false));
    224 }
    225 
    226 static jobjectArray Class_getDeclaredFields(JNIEnv* env, jobject javaThis) {
    227   ScopedFastNativeObjectAccess soa(env);
    228   return soa.AddLocalReference<jobjectArray>(
    229       GetDeclaredFields(soa.Self(), DecodeClass(soa, javaThis), false, true));
    230 }
    231 
    232 static jobjectArray Class_getPublicDeclaredFields(JNIEnv* env, jobject javaThis) {
    233   ScopedFastNativeObjectAccess soa(env);
    234   return soa.AddLocalReference<jobjectArray>(
    235       GetDeclaredFields(soa.Self(), DecodeClass(soa, javaThis), true, true));
    236 }
    237 
    238 // Performs a binary search through an array of fields, TODO: Is this fast enough if we don't use
    239 // the dex cache for lookups? I think CompareModifiedUtf8ToUtf16AsCodePointValues should be fairly
    240 // fast.
    241 ALWAYS_INLINE static inline ArtField* FindFieldByName(ObjPtr<mirror::String> name,
    242                                                       LengthPrefixedArray<ArtField>* fields)
    243     REQUIRES_SHARED(Locks::mutator_lock_) {
    244   if (fields == nullptr) {
    245     return nullptr;
    246   }
    247   size_t low = 0;
    248   size_t high = fields->size();
    249   const bool is_name_compressed = name->IsCompressed();
    250   const uint16_t* const data = (is_name_compressed) ? nullptr : name->GetValue();
    251   const uint8_t* const data_compressed = (is_name_compressed) ? name->GetValueCompressed()
    252                                                               : nullptr;
    253   const size_t length = name->GetLength();
    254   while (low < high) {
    255     auto mid = (low + high) / 2;
    256     ArtField& field = fields->At(mid);
    257     int result = 0;
    258     if (is_name_compressed) {
    259       size_t field_length = strlen(field.GetName());
    260       size_t min_size = (length < field_length) ? length : field_length;
    261       result = memcmp(field.GetName(), data_compressed, min_size);
    262       if (result == 0) {
    263         result = field_length - length;
    264       }
    265     } else {
    266       result = CompareModifiedUtf8ToUtf16AsCodePointValues(field.GetName(), data, length);
    267     }
    268     // Alternate approach, only a few % faster at the cost of more allocations.
    269     // int result = field->GetStringName(self, true)->CompareTo(name);
    270     if (result < 0) {
    271       low = mid + 1;
    272     } else if (result > 0) {
    273       high = mid;
    274     } else {
    275       return &field;
    276     }
    277   }
    278   if (kIsDebugBuild) {
    279     for (ArtField& field : MakeIterationRangeFromLengthPrefixedArray(fields)) {
    280       CHECK_NE(field.GetName(), name->ToModifiedUtf8());
    281     }
    282   }
    283   return nullptr;
    284 }
    285 
    286 ALWAYS_INLINE static inline mirror::Field* GetDeclaredField(Thread* self,
    287                                                             ObjPtr<mirror::Class> c,
    288                                                             ObjPtr<mirror::String> name)
    289     REQUIRES_SHARED(Locks::mutator_lock_) {
    290   ArtField* art_field = FindFieldByName(name, c->GetIFieldsPtr());
    291   if (art_field != nullptr) {
    292     return mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, art_field, true);
    293   }
    294   art_field = FindFieldByName(name, c->GetSFieldsPtr());
    295   if (art_field != nullptr) {
    296     return mirror::Field::CreateFromArtField<kRuntimePointerSize>(self, art_field, true);
    297   }
    298   return nullptr;
    299 }
    300 
    301 static mirror::Field* GetPublicFieldRecursive(
    302     Thread* self, ObjPtr<mirror::Class> clazz, ObjPtr<mirror::String> name)
    303     REQUIRES_SHARED(Locks::mutator_lock_) {
    304   DCHECK(clazz != nullptr);
    305   DCHECK(name != nullptr);
    306   DCHECK(self != nullptr);
    307 
    308   StackHandleScope<2> hs(self);
    309   MutableHandle<mirror::Class> h_clazz(hs.NewHandle(clazz));
    310   Handle<mirror::String> h_name(hs.NewHandle(name));
    311 
    312   // We search the current class, its direct interfaces then its superclass.
    313   while (h_clazz != nullptr) {
    314     mirror::Field* result = GetDeclaredField(self, h_clazz.Get(), h_name.Get());
    315     if ((result != nullptr) && (result->GetAccessFlags() & kAccPublic)) {
    316       return result;
    317     } else if (UNLIKELY(self->IsExceptionPending())) {
    318       // Something went wrong. Bail out.
    319       return nullptr;
    320     }
    321 
    322     uint32_t num_direct_interfaces = h_clazz->NumDirectInterfaces();
    323     for (uint32_t i = 0; i < num_direct_interfaces; i++) {
    324       ObjPtr<mirror::Class> iface = mirror::Class::ResolveDirectInterface(self, h_clazz, i);
    325       if (UNLIKELY(iface == nullptr)) {
    326         self->AssertPendingException();
    327         return nullptr;
    328       }
    329       result = GetPublicFieldRecursive(self, iface, h_name.Get());
    330       if (result != nullptr) {
    331         DCHECK(result->GetAccessFlags() & kAccPublic);
    332         return result;
    333       } else if (UNLIKELY(self->IsExceptionPending())) {
    334         // Something went wrong. Bail out.
    335         return nullptr;
    336       }
    337     }
    338 
    339     // We don't try the superclass if we are an interface.
    340     if (h_clazz->IsInterface()) {
    341       break;
    342     }
    343 
    344     // Get the next class.
    345     h_clazz.Assign(h_clazz->GetSuperClass());
    346   }
    347   return nullptr;
    348 }
    349 
    350 static jobject Class_getPublicFieldRecursive(JNIEnv* env, jobject javaThis, jstring name) {
    351   ScopedFastNativeObjectAccess soa(env);
    352   auto name_string = soa.Decode<mirror::String>(name);
    353   if (UNLIKELY(name_string == nullptr)) {
    354     ThrowNullPointerException("name == null");
    355     return nullptr;
    356   }
    357   return soa.AddLocalReference<jobject>(
    358       GetPublicFieldRecursive(soa.Self(), DecodeClass(soa, javaThis), name_string));
    359 }
    360 
    361 static jobject Class_getDeclaredField(JNIEnv* env, jobject javaThis, jstring name) {
    362   ScopedFastNativeObjectAccess soa(env);
    363   StackHandleScope<3> hs(soa.Self());
    364   Handle<mirror::String> h_string = hs.NewHandle(soa.Decode<mirror::String>(name));
    365   if (h_string == nullptr) {
    366     ThrowNullPointerException("name == null");
    367     return nullptr;
    368   }
    369   Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
    370   Handle<mirror::Field> result =
    371       hs.NewHandle(GetDeclaredField(soa.Self(), h_klass.Get(), h_string.Get()));
    372   if (result == nullptr) {
    373     std::string name_str = h_string->ToModifiedUtf8();
    374     if (name_str == "value" && h_klass->IsStringClass()) {
    375       // We log the error for this specific case, as the user might just swallow the exception.
    376       // This helps diagnose crashes when applications rely on the String#value field being
    377       // there.
    378       // Also print on the error stream to test it through run-test.
    379       std::string message("The String#value field is not present on Android versions >= 6.0");
    380       LOG(ERROR) << message;
    381       std::cerr << message << std::endl;
    382     }
    383     // We may have a pending exception if we failed to resolve.
    384     if (!soa.Self()->IsExceptionPending()) {
    385       ThrowNoSuchFieldException(h_klass.Get(), name_str.c_str());
    386     }
    387     return nullptr;
    388   }
    389   return soa.AddLocalReference<jobject>(result.Get());
    390 }
    391 
    392 static jobject Class_getDeclaredConstructorInternal(
    393     JNIEnv* env, jobject javaThis, jobjectArray args) {
    394   ScopedFastNativeObjectAccess soa(env);
    395   DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
    396   DCHECK(!Runtime::Current()->IsActiveTransaction());
    397   ObjPtr<mirror::Constructor> result =
    398       mirror::Class::GetDeclaredConstructorInternal<kRuntimePointerSize, false>(
    399       soa.Self(),
    400       DecodeClass(soa, javaThis),
    401       soa.Decode<mirror::ObjectArray<mirror::Class>>(args));
    402   return soa.AddLocalReference<jobject>(result);
    403 }
    404 
    405 static ALWAYS_INLINE inline bool MethodMatchesConstructor(ArtMethod* m, bool public_only)
    406     REQUIRES_SHARED(Locks::mutator_lock_) {
    407   DCHECK(m != nullptr);
    408   return (!public_only || m->IsPublic()) && !m->IsStatic() && m->IsConstructor();
    409 }
    410 
    411 static jobjectArray Class_getDeclaredConstructorsInternal(
    412     JNIEnv* env, jobject javaThis, jboolean publicOnly) {
    413   ScopedFastNativeObjectAccess soa(env);
    414   StackHandleScope<2> hs(soa.Self());
    415   Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
    416   size_t constructor_count = 0;
    417   // Two pass approach for speed.
    418   for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
    419     constructor_count += MethodMatchesConstructor(&m, publicOnly != JNI_FALSE) ? 1u : 0u;
    420   }
    421   auto h_constructors = hs.NewHandle(mirror::ObjectArray<mirror::Constructor>::Alloc(
    422       soa.Self(), mirror::Constructor::ArrayClass(), constructor_count));
    423   if (UNLIKELY(h_constructors == nullptr)) {
    424     soa.Self()->AssertPendingException();
    425     return nullptr;
    426   }
    427   constructor_count = 0;
    428   for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
    429     if (MethodMatchesConstructor(&m, publicOnly != JNI_FALSE)) {
    430       DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
    431       DCHECK(!Runtime::Current()->IsActiveTransaction());
    432       auto* constructor = mirror::Constructor::CreateFromArtMethod<kRuntimePointerSize, false>(
    433           soa.Self(), &m);
    434       if (UNLIKELY(constructor == nullptr)) {
    435         soa.Self()->AssertPendingOOMException();
    436         return nullptr;
    437       }
    438       h_constructors->SetWithoutChecks<false>(constructor_count++, constructor);
    439     }
    440   }
    441   return soa.AddLocalReference<jobjectArray>(h_constructors.Get());
    442 }
    443 
    444 static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis,
    445                                                jobject name, jobjectArray args) {
    446   ScopedFastNativeObjectAccess soa(env);
    447   DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
    448   DCHECK(!Runtime::Current()->IsActiveTransaction());
    449   ObjPtr<mirror::Method> result =
    450       mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize, false>(
    451           soa.Self(),
    452           DecodeClass(soa, javaThis),
    453           soa.Decode<mirror::String>(name),
    454           soa.Decode<mirror::ObjectArray<mirror::Class>>(args));
    455   return soa.AddLocalReference<jobject>(result);
    456 }
    457 
    458 static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaThis,
    459                                                       jboolean publicOnly) {
    460   ScopedFastNativeObjectAccess soa(env);
    461   StackHandleScope<2> hs(soa.Self());
    462   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
    463   size_t num_methods = 0;
    464   for (auto& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
    465     auto modifiers = m.GetAccessFlags();
    466     // Add non-constructor declared methods.
    467     if ((publicOnly == JNI_FALSE || (modifiers & kAccPublic) != 0) &&
    468         (modifiers & kAccConstructor) == 0) {
    469       ++num_methods;
    470     }
    471   }
    472   auto ret = hs.NewHandle(mirror::ObjectArray<mirror::Method>::Alloc(
    473       soa.Self(), mirror::Method::ArrayClass(), num_methods));
    474   if (ret == nullptr) {
    475     soa.Self()->AssertPendingOOMException();
    476     return nullptr;
    477   }
    478   num_methods = 0;
    479   for (auto& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
    480     auto modifiers = m.GetAccessFlags();
    481     if ((publicOnly == JNI_FALSE || (modifiers & kAccPublic) != 0) &&
    482         (modifiers & kAccConstructor) == 0) {
    483       DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
    484       DCHECK(!Runtime::Current()->IsActiveTransaction());
    485       auto* method =
    486           mirror::Method::CreateFromArtMethod<kRuntimePointerSize, false>(soa.Self(), &m);
    487       if (method == nullptr) {
    488         soa.Self()->AssertPendingException();
    489         return nullptr;
    490       }
    491       ret->SetWithoutChecks<false>(num_methods++, method);
    492     }
    493   }
    494   return soa.AddLocalReference<jobjectArray>(ret.Get());
    495 }
    496 
    497 static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass annotationClass) {
    498   ScopedFastNativeObjectAccess soa(env);
    499   StackHandleScope<2> hs(soa.Self());
    500   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    501 
    502   // Handle public contract to throw NPE if the "annotationClass" argument was null.
    503   if (UNLIKELY(annotationClass == nullptr)) {
    504     ThrowNullPointerException("annotationClass");
    505     return nullptr;
    506   }
    507 
    508   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    509     return nullptr;
    510   }
    511   Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationClass)));
    512   return soa.AddLocalReference<jobject>(
    513       annotations::GetAnnotationForClass(klass, annotation_class));
    514 }
    515 
    516 static jobjectArray Class_getDeclaredAnnotations(JNIEnv* env, jobject javaThis) {
    517   ScopedFastNativeObjectAccess soa(env);
    518   StackHandleScope<1> hs(soa.Self());
    519   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    520   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    521     // Return an empty array instead of a null pointer.
    522     ObjPtr<mirror::Class>  annotation_array_class =
    523         soa.Decode<mirror::Class>(WellKnownClasses::java_lang_annotation_Annotation__array);
    524     mirror::ObjectArray<mirror::Object>* empty_array =
    525         mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(),
    526                                                    annotation_array_class.Ptr(),
    527                                                    0);
    528     return soa.AddLocalReference<jobjectArray>(empty_array);
    529   }
    530   return soa.AddLocalReference<jobjectArray>(annotations::GetAnnotationsForClass(klass));
    531 }
    532 
    533 static jobjectArray Class_getDeclaredClasses(JNIEnv* env, jobject javaThis) {
    534   ScopedFastNativeObjectAccess soa(env);
    535   StackHandleScope<1> hs(soa.Self());
    536   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    537   mirror::ObjectArray<mirror::Class>* classes = nullptr;
    538   if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) {
    539     classes = annotations::GetDeclaredClasses(klass);
    540   }
    541   if (classes == nullptr) {
    542     // Return an empty array instead of a null pointer.
    543     if (soa.Self()->IsExceptionPending()) {
    544       // Pending exception from GetDeclaredClasses.
    545       return nullptr;
    546     }
    547     ObjPtr<mirror::Class> class_array_class = GetClassArrayClass(soa.Self());
    548     if (class_array_class == nullptr) {
    549       return nullptr;
    550     }
    551     ObjPtr<mirror::ObjectArray<mirror::Class>> empty_array =
    552         mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class, 0);
    553     return soa.AddLocalReference<jobjectArray>(empty_array);
    554   }
    555   return soa.AddLocalReference<jobjectArray>(classes);
    556 }
    557 
    558 static jclass Class_getEnclosingClass(JNIEnv* env, jobject javaThis) {
    559   ScopedFastNativeObjectAccess soa(env);
    560   StackHandleScope<1> hs(soa.Self());
    561   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    562   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    563     return nullptr;
    564   }
    565   return soa.AddLocalReference<jclass>(annotations::GetEnclosingClass(klass));
    566 }
    567 
    568 static jobject Class_getEnclosingConstructorNative(JNIEnv* env, jobject javaThis) {
    569   ScopedFastNativeObjectAccess soa(env);
    570   StackHandleScope<1> hs(soa.Self());
    571   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    572   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    573     return nullptr;
    574   }
    575   ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
    576   if (method != nullptr) {
    577     if (soa.Decode<mirror::Class>(WellKnownClasses::java_lang_reflect_Constructor) ==
    578         method->GetClass()) {
    579       return soa.AddLocalReference<jobject>(method);
    580     }
    581   }
    582   return nullptr;
    583 }
    584 
    585 static jobject Class_getEnclosingMethodNative(JNIEnv* env, jobject javaThis) {
    586   ScopedFastNativeObjectAccess soa(env);
    587   StackHandleScope<1> hs(soa.Self());
    588   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    589   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    590     return nullptr;
    591   }
    592   ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
    593   if (method != nullptr) {
    594     if (soa.Decode<mirror::Class>(WellKnownClasses::java_lang_reflect_Method) ==
    595         method->GetClass()) {
    596       return soa.AddLocalReference<jobject>(method);
    597     }
    598   }
    599   return nullptr;
    600 }
    601 
    602 static jint Class_getInnerClassFlags(JNIEnv* env, jobject javaThis, jint defaultValue) {
    603   ScopedFastNativeObjectAccess soa(env);
    604   StackHandleScope<1> hs(soa.Self());
    605   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    606   return mirror::Class::GetInnerClassFlags(klass, defaultValue);
    607 }
    608 
    609 static jstring Class_getInnerClassName(JNIEnv* env, jobject javaThis) {
    610   ScopedFastNativeObjectAccess soa(env);
    611   StackHandleScope<1> hs(soa.Self());
    612   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    613   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    614     return nullptr;
    615   }
    616   mirror::String* class_name = nullptr;
    617   if (!annotations::GetInnerClass(klass, &class_name)) {
    618     return nullptr;
    619   }
    620   return soa.AddLocalReference<jstring>(class_name);
    621 }
    622 
    623 static jobjectArray Class_getSignatureAnnotation(JNIEnv* env, jobject javaThis) {
    624   ScopedFastNativeObjectAccess soa(env);
    625   StackHandleScope<1> hs(soa.Self());
    626   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    627   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    628     return nullptr;
    629   }
    630   return soa.AddLocalReference<jobjectArray>(
    631       annotations::GetSignatureAnnotationForClass(klass));
    632 }
    633 
    634 static jboolean Class_isAnonymousClass(JNIEnv* env, jobject javaThis) {
    635   ScopedFastNativeObjectAccess soa(env);
    636   StackHandleScope<1> hs(soa.Self());
    637   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    638   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    639     return false;
    640   }
    641   mirror::String* class_name = nullptr;
    642   if (!annotations::GetInnerClass(klass, &class_name)) {
    643     return false;
    644   }
    645   return class_name == nullptr;
    646 }
    647 
    648 static jboolean Class_isDeclaredAnnotationPresent(JNIEnv* env, jobject javaThis,
    649                                                   jclass annotationType) {
    650   ScopedFastNativeObjectAccess soa(env);
    651   StackHandleScope<2> hs(soa.Self());
    652   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    653   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    654     return false;
    655   }
    656   Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationType)));
    657   return annotations::IsClassAnnotationPresent(klass, annotation_class);
    658 }
    659 
    660 static jclass Class_getDeclaringClass(JNIEnv* env, jobject javaThis) {
    661   ScopedFastNativeObjectAccess soa(env);
    662   StackHandleScope<1> hs(soa.Self());
    663   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
    664   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
    665     return nullptr;
    666   }
    667   // Return null for anonymous classes.
    668   if (Class_isAnonymousClass(env, javaThis)) {
    669     return nullptr;
    670   }
    671   return soa.AddLocalReference<jclass>(annotations::GetDeclaringClass(klass));
    672 }
    673 
    674 static jobject Class_newInstance(JNIEnv* env, jobject javaThis) {
    675   ScopedFastNativeObjectAccess soa(env);
    676   StackHandleScope<4> hs(soa.Self());
    677   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
    678   if (UNLIKELY(klass->GetPrimitiveType() != 0 || klass->IsInterface() || klass->IsArrayClass() ||
    679                klass->IsAbstract())) {
    680     soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
    681                                    "%s cannot be instantiated",
    682                                    klass->PrettyClass().c_str());
    683     return nullptr;
    684   }
    685   auto caller = hs.NewHandle<mirror::Class>(nullptr);
    686   // Verify that we can access the class.
    687   if (!klass->IsPublic()) {
    688     caller.Assign(GetCallingClass(soa.Self(), 1));
    689     if (caller != nullptr && !caller->CanAccess(klass.Get())) {
    690       soa.Self()->ThrowNewExceptionF(
    691           "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
    692           klass->PrettyClass().c_str(), caller->PrettyClass().c_str());
    693       return nullptr;
    694     }
    695   }
    696   auto* constructor = klass->GetDeclaredConstructor(
    697       soa.Self(),
    698       ScopedNullHandle<mirror::ObjectArray<mirror::Class>>(),
    699       kRuntimePointerSize);
    700   if (UNLIKELY(constructor == nullptr)) {
    701     soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
    702                                    "%s has no zero argument constructor",
    703                                    klass->PrettyClass().c_str());
    704     return nullptr;
    705   }
    706   // Invoke the string allocator to return an empty string for the string class.
    707   if (klass->IsStringClass()) {
    708     gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
    709     ObjPtr<mirror::Object> obj = mirror::String::AllocEmptyString<true>(soa.Self(), allocator_type);
    710     if (UNLIKELY(soa.Self()->IsExceptionPending())) {
    711       return nullptr;
    712     } else {
    713       return soa.AddLocalReference<jobject>(obj);
    714     }
    715   }
    716   auto receiver = hs.NewHandle(klass->AllocObject(soa.Self()));
    717   if (UNLIKELY(receiver == nullptr)) {
    718     soa.Self()->AssertPendingOOMException();
    719     return nullptr;
    720   }
    721   // Verify that we can access the constructor.
    722   auto* declaring_class = constructor->GetDeclaringClass();
    723   if (!constructor->IsPublic()) {
    724     if (caller == nullptr) {
    725       caller.Assign(GetCallingClass(soa.Self(), 1));
    726     }
    727     if (UNLIKELY(caller != nullptr && !VerifyAccess(receiver.Get(),
    728                                                           declaring_class,
    729                                                           constructor->GetAccessFlags(),
    730                                                           caller.Get()))) {
    731       soa.Self()->ThrowNewExceptionF(
    732           "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
    733           constructor->PrettyMethod().c_str(), caller->PrettyClass().c_str());
    734       return nullptr;
    735     }
    736   }
    737   // Ensure that we are initialized.
    738   if (UNLIKELY(!declaring_class->IsInitialized())) {
    739     if (!Runtime::Current()->GetClassLinker()->EnsureInitialized(
    740         soa.Self(), hs.NewHandle(declaring_class), true, true)) {
    741       soa.Self()->AssertPendingException();
    742       return nullptr;
    743     }
    744   }
    745   // Invoke the constructor.
    746   JValue result;
    747   uint32_t args[1] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(receiver.Get())) };
    748   constructor->Invoke(soa.Self(), args, sizeof(args), &result, "V");
    749   if (UNLIKELY(soa.Self()->IsExceptionPending())) {
    750     return nullptr;
    751   }
    752   // Constructors are ()V methods, so we shouldn't touch the result of InvokeMethod.
    753   return soa.AddLocalReference<jobject>(receiver.Get());
    754 }
    755 
    756 static JNINativeMethod gMethods[] = {
    757   FAST_NATIVE_METHOD(Class, classForName,
    758                 "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"),
    759   FAST_NATIVE_METHOD(Class, getDeclaredAnnotation,
    760                 "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"),
    761   FAST_NATIVE_METHOD(Class, getDeclaredAnnotations, "()[Ljava/lang/annotation/Annotation;"),
    762   FAST_NATIVE_METHOD(Class, getDeclaredClasses, "()[Ljava/lang/Class;"),
    763   FAST_NATIVE_METHOD(Class, getDeclaredConstructorInternal,
    764                 "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"),
    765   FAST_NATIVE_METHOD(Class, getDeclaredConstructorsInternal, "(Z)[Ljava/lang/reflect/Constructor;"),
    766   FAST_NATIVE_METHOD(Class, getDeclaredField, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
    767   FAST_NATIVE_METHOD(Class, getPublicFieldRecursive, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
    768   FAST_NATIVE_METHOD(Class, getDeclaredFields, "()[Ljava/lang/reflect/Field;"),
    769   FAST_NATIVE_METHOD(Class, getDeclaredFieldsUnchecked, "(Z)[Ljava/lang/reflect/Field;"),
    770   FAST_NATIVE_METHOD(Class, getDeclaredMethodInternal,
    771                 "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"),
    772   FAST_NATIVE_METHOD(Class, getDeclaredMethodsUnchecked,
    773                 "(Z)[Ljava/lang/reflect/Method;"),
    774   FAST_NATIVE_METHOD(Class, getDeclaringClass, "()Ljava/lang/Class;"),
    775   FAST_NATIVE_METHOD(Class, getEnclosingClass, "()Ljava/lang/Class;"),
    776   FAST_NATIVE_METHOD(Class, getEnclosingConstructorNative, "()Ljava/lang/reflect/Constructor;"),
    777   FAST_NATIVE_METHOD(Class, getEnclosingMethodNative, "()Ljava/lang/reflect/Method;"),
    778   FAST_NATIVE_METHOD(Class, getInnerClassFlags, "(I)I"),
    779   FAST_NATIVE_METHOD(Class, getInnerClassName, "()Ljava/lang/String;"),
    780   FAST_NATIVE_METHOD(Class, getInterfacesInternal, "()[Ljava/lang/Class;"),
    781   FAST_NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
    782   FAST_NATIVE_METHOD(Class, getPublicDeclaredFields, "()[Ljava/lang/reflect/Field;"),
    783   FAST_NATIVE_METHOD(Class, getSignatureAnnotation, "()[Ljava/lang/String;"),
    784   FAST_NATIVE_METHOD(Class, isAnonymousClass, "()Z"),
    785   FAST_NATIVE_METHOD(Class, isDeclaredAnnotationPresent, "(Ljava/lang/Class;)Z"),
    786   FAST_NATIVE_METHOD(Class, newInstance, "()Ljava/lang/Object;"),
    787 };
    788 
    789 void register_java_lang_Class(JNIEnv* env) {
    790   REGISTER_NATIVE_METHODS("java/lang/Class");
    791 }
    792 
    793 }  // namespace art
    794