• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-alloc-inl.h"
23 #include "base/pointer_size.h"
24 #include "class_linker-inl.h"
25 #include "class_root-inl.h"
26 #include "common_throws.h"
27 #include "compat_framework.h"
28 #include "dex/descriptors_names.h"
29 #include "dex/dex_file-inl.h"
30 #include "dex/dex_file_annotations.h"
31 #include "dex/utf.h"
32 #include "hidden_api.h"
33 #include "jni/jni_internal.h"
34 #include "mirror/class-alloc-inl.h"
35 #include "mirror/class_ext.h"
36 #include "mirror/class-inl.h"
37 #include "mirror/class_loader.h"
38 #include "mirror/field.h"
39 #include "mirror/method.h"
40 #include "mirror/method_handles_lookup.h"
41 #include "mirror/object-inl.h"
42 #include "mirror/object_array-alloc-inl.h"
43 #include "mirror/object_array-inl.h"
44 #include "mirror/proxy.h"
45 #include "mirror/string-alloc-inl.h"
46 #include "mirror/string-inl.h"
47 #include "native_util.h"
48 #include "nativehelper/jni_macros.h"
49 #include "nativehelper/scoped_local_ref.h"
50 #include "nativehelper/scoped_utf_chars.h"
51 #include "nth_caller_visitor.h"
52 #include "obj_ptr-inl.h"
53 #include "reflection.h"
54 #include "reflective_handle_scope-inl.h"
55 #include "scoped_fast_native_object_access-inl.h"
56 #include "scoped_thread_state_change-inl.h"
57 #include "well_known_classes-inl.h"
58 
59 namespace art HIDDEN {
60 
GetHiddenapiAccessContextFunction(Thread * self)61 static std::function<hiddenapi::AccessContext()> GetHiddenapiAccessContextFunction(Thread* self) {
62   return [=]() REQUIRES_SHARED(Locks::mutator_lock_) {
63     return hiddenapi::GetReflectionCallerAccessContext(self);
64   };
65 }
66 
67 // Returns true if the first non-ClassClass caller up the stack should not be
68 // allowed access to `member`.
69 template<typename T>
ShouldDenyAccessToMember(T * member,Thread * self)70 ALWAYS_INLINE static bool ShouldDenyAccessToMember(T* member, Thread* self)
71     REQUIRES_SHARED(Locks::mutator_lock_) {
72   return hiddenapi::ShouldDenyAccessToMember(member,
73                                              GetHiddenapiAccessContextFunction(self),
74                                              hiddenapi::AccessMethod::kReflection);
75 }
76 
DecodeClass(const ScopedFastNativeObjectAccess & soa,jobject java_class)77 ALWAYS_INLINE static inline ObjPtr<mirror::Class> DecodeClass(
78     const ScopedFastNativeObjectAccess& soa, jobject java_class)
79     REQUIRES_SHARED(Locks::mutator_lock_) {
80   ObjPtr<mirror::Class> c = soa.Decode<mirror::Class>(java_class);
81   DCHECK(c != nullptr);
82   DCHECK(c->IsClass());
83   // TODO: we could EnsureInitialized here, rather than on every reflective get/set or invoke .
84   // For now, we conservatively preserve the old dalvik behavior. A quick "IsInitialized" check
85   // every time probably doesn't make much difference to reflection performance anyway.
86   return c;
87 }
88 
89 // "name" is in "binary name" format, e.g. "dalvik.system.Debug$1".
Class_classForName(JNIEnv * env,jclass,jstring javaName,jboolean initialize,jobject javaLoader)90 static jclass Class_classForName(JNIEnv* env, jclass, jstring javaName, jboolean initialize,
91                                  jobject javaLoader) {
92   ScopedFastNativeObjectAccess soa(env);
93   StackHandleScope<3> hs(soa.Self());
94   Handle<mirror::String> mirror_name = hs.NewHandle(soa.Decode<mirror::String>(javaName));
95   if (mirror_name == nullptr) {
96     soa.Self()->ThrowNewWrappedException("Ljava/lang/NullPointerException;", /*msg=*/ nullptr);
97     return nullptr;
98   }
99 
100   // We need to validate and convert the name (from x.y.z to x/y/z).  This
101   // is especially handy for array types, since we want to avoid
102   // auto-generating bogus array classes.
103   std::string name = mirror_name->ToModifiedUtf8();
104   if (!IsValidBinaryClassName(name.c_str())) {
105     soa.Self()->ThrowNewExceptionF("Ljava/lang/ClassNotFoundException;",
106                                    "Invalid name: %s", name.c_str());
107     return nullptr;
108   }
109 
110   std::string descriptor = DotToDescriptor(name);
111   Handle<mirror::ClassLoader> class_loader(
112       hs.NewHandle(soa.Decode<mirror::ClassLoader>(javaLoader)));
113   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
114   Handle<mirror::Class> c = hs.NewHandle(
115       class_linker->FindClass(soa.Self(), descriptor.c_str(), descriptor.length(), class_loader));
116   if (UNLIKELY(c == nullptr)) {
117     StackHandleScope<2> hs2(soa.Self());
118     Handle<mirror::Object> cause = hs2.NewHandle(soa.Self()->GetException());
119     soa.Self()->ClearException();
120     Handle<mirror::Object> cnfe =
121         WellKnownClasses::java_lang_ClassNotFoundException_init->NewObject<'L', 'L'>(
122             hs2, soa.Self(), mirror_name, cause);
123     if (cnfe != nullptr) {
124       // Make sure allocation didn't fail with an OOME.
125       soa.Self()->SetException(ObjPtr<mirror::Throwable>::DownCast(cnfe.Get()));
126     }
127     return nullptr;
128   }
129   if (initialize) {
130     class_linker->EnsureInitialized(soa.Self(), c, true, true);
131   }
132 
133   // java.lang.ClassValue was added in Android U, and proguarding tools
134   // used that as justification to remove computeValue method implementation.
135   // Usual pattern was to check that Class.forName("java.lang.ClassValue")
136   // call does not throw and use ClassValue-based implementation or fallback
137   // to other solution if it does throw.
138   // So far ClassValue is the only class with such a problem and hence this
139   // ad-hoc check.
140   // See b/259501764.
141   if (!c->CheckIsVisibleWithTargetSdk(soa.Self())) {
142     DCHECK(soa.Self()->IsExceptionPending());
143     return nullptr;
144   }
145 
146   return soa.AddLocalReference<jclass>(c.Get());
147 }
148 
Class_getPrimitiveClass(JNIEnv * env,jclass,jstring name)149 static jclass Class_getPrimitiveClass(JNIEnv* env, jclass, jstring name) {
150   ScopedFastNativeObjectAccess soa(env);
151   ObjPtr<mirror::Class> klass = mirror::Class::GetPrimitiveClass(soa.Decode<mirror::String>(name));
152   return soa.AddLocalReference<jclass>(klass);
153 }
154 
Class_getNameNative(JNIEnv * env,jobject javaThis)155 static jstring Class_getNameNative(JNIEnv* env, jobject javaThis) {
156   ScopedFastNativeObjectAccess soa(env);
157   StackHandleScope<1> hs(soa.Self());
158   ObjPtr<mirror::Class> c = DecodeClass(soa, javaThis);
159   return soa.AddLocalReference<jstring>(mirror::Class::ComputeName(hs.NewHandle(c)));
160 }
161 
Class_getInterfacesInternal(JNIEnv * env,jobject javaThis)162 static jobjectArray Class_getInterfacesInternal(JNIEnv* env, jobject javaThis) {
163   ScopedFastNativeObjectAccess soa(env);
164   StackHandleScope<1> hs(soa.Self());
165   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
166   if (klass->IsObsoleteObject()) {
167     ThrowRuntimeException("Obsolete Object!");
168     return nullptr;
169   }
170 
171   if (klass->IsProxyClass()) {
172     StackHandleScope<1> hs2(soa.Self());
173     Handle<mirror::ObjectArray<mirror::Class>> interfaces =
174         hs2.NewHandle(klass->GetProxyInterfaces());
175     return soa.AddLocalReference<jobjectArray>(
176         mirror::ObjectArray<mirror::Class>::Clone(interfaces, soa.Self()));
177   }
178 
179   const dex::TypeList* iface_list = klass->GetInterfaceTypeList();
180   if (iface_list == nullptr) {
181     return nullptr;
182   }
183 
184   ClassLinker* linker = Runtime::Current()->GetClassLinker();
185   const uint32_t num_ifaces = iface_list->Size();
186   ObjPtr<mirror::Class> class_array_class =
187       GetClassRoot<mirror::ObjectArray<mirror::Class>>(linker);
188   ObjPtr<mirror::ObjectArray<mirror::Class>> ifaces =
189       mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class, num_ifaces);
190   if (ifaces.IsNull()) {
191     DCHECK(soa.Self()->IsExceptionPending());
192     return nullptr;
193   }
194 
195   // Check that we aren't in an active transaction, we call SetWithoutChecks
196   // with kActiveTransaction == false.
197   DCHECK(!Runtime::Current()->IsActiveTransaction());
198 
199   for (uint32_t i = 0; i < num_ifaces; ++i) {
200     const dex::TypeIndex type_idx = iface_list->GetTypeItem(i).type_idx_;
201     ObjPtr<mirror::Class> interface = linker->LookupResolvedType(type_idx, klass.Get());
202     DCHECK(interface != nullptr);
203     ifaces->SetWithoutChecks<false>(i, interface);
204   }
205 
206   return soa.AddLocalReference<jobjectArray>(ifaces);
207 }
208 
Class_getDeclaredFieldsUnchecked(JNIEnv * env,jobject javaThis,jboolean publicOnly)209 static jobjectArray Class_getDeclaredFieldsUnchecked(JNIEnv* env, jobject javaThis,
210                                                      jboolean publicOnly) {
211   ScopedFastNativeObjectAccess soa(env);
212   ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
213   return soa.AddLocalReference<jobjectArray>(
214       klass->GetDeclaredFields(soa.Self(),
215                                publicOnly != JNI_FALSE,
216                                /*force_resolve=*/ false));
217 }
218 
Class_getDeclaredFields(JNIEnv * env,jobject javaThis)219 static jobjectArray Class_getDeclaredFields(JNIEnv* env, jobject javaThis) {
220   ScopedFastNativeObjectAccess soa(env);
221   ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
222   return soa.AddLocalReference<jobjectArray>(
223       klass->GetDeclaredFields(soa.Self(),
224                                /*public_only=*/ false,
225                                /*force_resolve=*/ true));
226 }
227 
Class_getPublicDeclaredFields(JNIEnv * env,jobject javaThis)228 static jobjectArray Class_getPublicDeclaredFields(JNIEnv* env, jobject javaThis) {
229   ScopedFastNativeObjectAccess soa(env);
230   ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
231   return soa.AddLocalReference<jobjectArray>(
232       klass->GetDeclaredFields(soa.Self(),
233                                /*public_only=*/ true,
234                                /*force_resolve=*/ true));
235 }
236 
237 // Performs a binary search through an array of fields, TODO: Is this fast enough if we don't use
238 // the dex cache for lookups? I think CompareModifiedUtf8ToUtf16AsCodePointValues should be fairly
239 // fast.
FindFieldByName(ObjPtr<mirror::String> name,LengthPrefixedArray<ArtField> * fields)240 ALWAYS_INLINE static inline ArtField* FindFieldByName(ObjPtr<mirror::String> name,
241                                                       LengthPrefixedArray<ArtField>* fields)
242     REQUIRES_SHARED(Locks::mutator_lock_) {
243   if (fields == nullptr) {
244     return nullptr;
245   }
246   size_t low = 0;
247   size_t high = fields->size();
248   const bool is_name_compressed = name->IsCompressed();
249   const uint16_t* const data = (is_name_compressed) ? nullptr : name->GetValue();
250   const uint8_t* const data_compressed = (is_name_compressed) ? name->GetValueCompressed()
251                                                               : nullptr;
252   const size_t length = name->GetLength();
253   while (low < high) {
254     auto mid = (low + high) / 2;
255     ArtField& field = fields->At(mid);
256     int result = 0;
257     if (is_name_compressed) {
258       size_t field_length = strlen(field.GetName());
259       size_t min_size = (length < field_length) ? length : field_length;
260       result = memcmp(field.GetName(), data_compressed, min_size);
261       if (result == 0) {
262         result = field_length - length;
263       }
264     } else {
265       result = CompareModifiedUtf8ToUtf16AsCodePointValues(field.GetName(), data, length);
266     }
267     // Alternate approach, only a few % faster at the cost of more allocations.
268     // int result = field->GetStringName(self, true)->CompareTo(name);
269     if (result < 0) {
270       low = mid + 1;
271     } else if (result > 0) {
272       high = mid;
273     } else {
274       return &field;
275     }
276   }
277   if (kIsDebugBuild) {
278     for (ArtField& field : MakeIterationRangeFromLengthPrefixedArray(fields)) {
279       CHECK_NE(field.GetName(), name->ToModifiedUtf8());
280     }
281   }
282   return nullptr;
283 }
284 
GetDeclaredField(Thread * self,ObjPtr<mirror::Class> c,ObjPtr<mirror::String> name)285 ALWAYS_INLINE static inline ObjPtr<mirror::Field> GetDeclaredField(Thread* self,
286                                                                    ObjPtr<mirror::Class> c,
287                                                                    ObjPtr<mirror::String> name)
288     REQUIRES_SHARED(Locks::mutator_lock_) {
289   if (UNLIKELY(c->IsObsoleteObject())) {
290     ThrowRuntimeException("Obsolete Object!");
291     return nullptr;
292   }
293   ArtField* art_field = FindFieldByName(name, c->GetFieldsPtr());
294   if (art_field != nullptr) {
295     return mirror::Field::CreateFromArtField(self, art_field, true);
296   }
297   return nullptr;
298 }
299 
GetPublicFieldRecursive(Thread * self,ObjPtr<mirror::Class> clazz,ObjPtr<mirror::String> name)300 static ObjPtr<mirror::Field> GetPublicFieldRecursive(
301     Thread* self, ObjPtr<mirror::Class> clazz, ObjPtr<mirror::String> name)
302     REQUIRES_SHARED(Locks::mutator_lock_) {
303   DCHECK(clazz != nullptr);
304   DCHECK(name != nullptr);
305   DCHECK(self != nullptr);
306 
307   if (UNLIKELY(clazz->IsObsoleteObject())) {
308     ThrowRuntimeException("Obsolete Object!");
309     return nullptr;
310   }
311   StackHandleScope<2> hs(self);
312   MutableHandle<mirror::Class> h_clazz(hs.NewHandle(clazz));
313   Handle<mirror::String> h_name(hs.NewHandle(name));
314 
315   // We search the current class, its direct interfaces then its superclass.
316   while (h_clazz != nullptr) {
317     ObjPtr<mirror::Field> result = GetDeclaredField(self, h_clazz.Get(), h_name.Get());
318     if ((result != nullptr) && (result->GetAccessFlags() & kAccPublic)) {
319       return result;
320     } else if (UNLIKELY(self->IsExceptionPending())) {
321       // Something went wrong. Bail out.
322       return nullptr;
323     }
324 
325     uint32_t num_direct_interfaces = h_clazz->NumDirectInterfaces();
326     for (uint32_t i = 0; i < num_direct_interfaces; i++) {
327       ObjPtr<mirror::Class> iface = mirror::Class::ResolveDirectInterface(self, h_clazz, i);
328       if (UNLIKELY(iface == nullptr)) {
329         self->AssertPendingException();
330         return nullptr;
331       }
332       result = GetPublicFieldRecursive(self, iface, h_name.Get());
333       if (result != nullptr) {
334         DCHECK(result->GetAccessFlags() & kAccPublic);
335         return result;
336       } else if (UNLIKELY(self->IsExceptionPending())) {
337         // Something went wrong. Bail out.
338         return nullptr;
339       }
340     }
341 
342     // We don't try the superclass if we are an interface.
343     if (h_clazz->IsInterface()) {
344       break;
345     }
346 
347     // Get the next class.
348     h_clazz.Assign(h_clazz->GetSuperClass());
349   }
350   return nullptr;
351 }
352 
Class_getPublicFieldRecursive(JNIEnv * env,jobject javaThis,jstring name)353 static jobject Class_getPublicFieldRecursive(JNIEnv* env, jobject javaThis, jstring name) {
354   ScopedFastNativeObjectAccess soa(env);
355   auto name_string = soa.Decode<mirror::String>(name);
356   if (UNLIKELY(name_string == nullptr)) {
357     ThrowNullPointerException("name == null");
358     return nullptr;
359   }
360 
361   StackHandleScope<1> hs(soa.Self());
362   Handle<mirror::Field> field = hs.NewHandle(GetPublicFieldRecursive(
363       soa.Self(), DecodeClass(soa, javaThis), name_string));
364   if (field.Get() == nullptr || ShouldDenyAccessToMember(field->GetArtField(), soa.Self())) {
365     return nullptr;
366   }
367   return soa.AddLocalReference<jobject>(field.Get());
368 }
369 
Class_getDeclaredField(JNIEnv * env,jobject javaThis,jstring name)370 static jobject Class_getDeclaredField(JNIEnv* env, jobject javaThis, jstring name) {
371   ScopedFastNativeObjectAccess soa(env);
372   StackHandleScope<3> hs(soa.Self());
373   Handle<mirror::String> h_string = hs.NewHandle(soa.Decode<mirror::String>(name));
374   if (h_string == nullptr) {
375     ThrowNullPointerException("name == null");
376     return nullptr;
377   }
378   Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
379   Handle<mirror::Field> result =
380       hs.NewHandle(GetDeclaredField(soa.Self(), h_klass.Get(), h_string.Get()));
381   if (result == nullptr || ShouldDenyAccessToMember(result->GetArtField(), soa.Self())) {
382     std::string name_str = h_string->ToModifiedUtf8();
383     if (name_str == "value" && h_klass->IsStringClass()) {
384       // We log the error for this specific case, as the user might just swallow the exception.
385       // This helps diagnose crashes when applications rely on the String#value field being
386       // there.
387       // Also print on the error stream to test it through run-test.
388       std::string message("The String#value field is not present on Android versions >= 6.0");
389       LOG(ERROR) << message;
390       std::cerr << message << std::endl;
391     }
392     // We may have a pending exception if we failed to resolve.
393     if (!soa.Self()->IsExceptionPending()) {
394       ThrowNoSuchFieldException(h_klass.Get(), name_str);
395     }
396     return nullptr;
397   }
398   return soa.AddLocalReference<jobject>(result.Get());
399 }
400 
Class_getDeclaredConstructorInternal(JNIEnv * env,jobject javaThis,jobjectArray args)401 static jobject Class_getDeclaredConstructorInternal(
402     JNIEnv* env, jobject javaThis, jobjectArray args) {
403   ScopedFastNativeObjectAccess soa(env);
404   DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
405   DCHECK(!Runtime::Current()->IsActiveTransaction());
406 
407   StackHandleScope<1> hs(soa.Self());
408   ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
409   if (UNLIKELY(klass->IsObsoleteObject())) {
410     ThrowRuntimeException("Obsolete Object!");
411     return nullptr;
412   }
413   Handle<mirror::Constructor> result = hs.NewHandle(
414       mirror::Class::GetDeclaredConstructorInternal<kRuntimePointerSize>(
415           soa.Self(),
416           klass,
417           soa.Decode<mirror::ObjectArray<mirror::Class>>(args)));
418   if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) {
419     return nullptr;
420   }
421   return soa.AddLocalReference<jobject>(result.Get());
422 }
423 
MethodMatchesConstructor(ArtMethod * m,bool public_only,const hiddenapi::AccessContext & hiddenapi_context)424 static ALWAYS_INLINE inline bool MethodMatchesConstructor(
425     ArtMethod* m,
426     bool public_only,
427     const hiddenapi::AccessContext& hiddenapi_context) REQUIRES_SHARED(Locks::mutator_lock_) {
428   DCHECK(m != nullptr);
429   return m->IsConstructor() &&
430          !m->IsStatic() &&
431          mirror::Class::IsDiscoverable(public_only, hiddenapi_context, m);
432 }
433 
Class_getDeclaredConstructorsInternal(JNIEnv * env,jobject javaThis,jboolean publicOnly)434 static jobjectArray Class_getDeclaredConstructorsInternal(
435     JNIEnv* env, jobject javaThis, jboolean publicOnly) {
436   ScopedFastNativeObjectAccess soa(env);
437   StackHandleScope<2> hs(soa.Self());
438   bool public_only = (publicOnly != JNI_FALSE);
439   auto hiddenapi_context = hiddenapi::GetReflectionCallerAccessContext(soa.Self());
440   Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
441   if (UNLIKELY(h_klass->IsObsoleteObject())) {
442     ThrowRuntimeException("Obsolete Object!");
443     return nullptr;
444   }
445   size_t constructor_count = 0;
446   // Two pass approach for speed.
447   for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
448     constructor_count += MethodMatchesConstructor(&m, public_only, hiddenapi_context) ? 1u : 0u;
449   }
450   auto h_constructors = hs.NewHandle(mirror::ObjectArray<mirror::Constructor>::Alloc(
451       soa.Self(), GetClassRoot<mirror::ObjectArray<mirror::Constructor>>(), constructor_count));
452   if (UNLIKELY(h_constructors == nullptr)) {
453     soa.Self()->AssertPendingException();
454     return nullptr;
455   }
456   constructor_count = 0;
457   for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
458     if (MethodMatchesConstructor(&m, public_only, hiddenapi_context)) {
459       DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
460       DCHECK(!Runtime::Current()->IsActiveTransaction());
461       ObjPtr<mirror::Constructor> constructor =
462           mirror::Constructor::CreateFromArtMethod<kRuntimePointerSize>(soa.Self(), &m);
463       if (UNLIKELY(constructor == nullptr)) {
464         soa.Self()->AssertPendingOOMException();
465         return nullptr;
466       }
467       h_constructors->SetWithoutChecks<false>(constructor_count++, constructor);
468     }
469   }
470   return soa.AddLocalReference<jobjectArray>(h_constructors.Get());
471 }
472 
Class_getDeclaredMethodInternal(JNIEnv * env,jobject javaThis,jstring name,jobjectArray args)473 static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis,
474                                                jstring name, jobjectArray args) {
475   ScopedFastNativeObjectAccess soa(env);
476   StackHandleScope<1> hs(soa.Self());
477   DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
478   DCHECK(!Runtime::Current()->IsActiveTransaction());
479   ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
480   if (UNLIKELY(klass->IsObsoleteObject())) {
481     ThrowRuntimeException("Obsolete Object!");
482     return nullptr;
483   }
484   Handle<mirror::Method> result = hs.NewHandle(
485       mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize>(
486           soa.Self(),
487           klass,
488           soa.Decode<mirror::String>(name),
489           soa.Decode<mirror::ObjectArray<mirror::Class>>(args),
490           GetHiddenapiAccessContextFunction(soa.Self())));
491   if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) {
492     return nullptr;
493   }
494   return soa.AddLocalReference<jobject>(result.Get());
495 }
496 
Class_getDeclaredMethodsUnchecked(JNIEnv * env,jobject javaThis,jboolean publicOnly)497 static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaThis,
498                                                       jboolean publicOnly) {
499   ScopedFastNativeObjectAccess soa(env);
500   StackHandleScope<2> hs(soa.Self());
501 
502   auto hiddenapi_context = hiddenapi::GetReflectionCallerAccessContext(soa.Self());
503   bool public_only = (publicOnly != JNI_FALSE);
504 
505   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
506   if (klass->IsObsoleteObject()) {
507     ThrowRuntimeException("Obsolete Object!");
508     return nullptr;
509   }
510   size_t num_methods = 0;
511   for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
512     uint32_t modifiers = m.GetAccessFlags();
513     // Add non-constructor declared methods.
514     if ((modifiers & kAccConstructor) == 0 &&
515         mirror::Class::IsDiscoverable(public_only, hiddenapi_context, &m)) {
516       ++num_methods;
517     }
518   }
519   auto ret = hs.NewHandle(mirror::ObjectArray<mirror::Method>::Alloc(
520       soa.Self(), GetClassRoot<mirror::ObjectArray<mirror::Method>>(), num_methods));
521   if (ret == nullptr) {
522     soa.Self()->AssertPendingOOMException();
523     return nullptr;
524   }
525   num_methods = 0;
526   for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
527     uint32_t modifiers = m.GetAccessFlags();
528     if ((modifiers & kAccConstructor) == 0 &&
529         mirror::Class::IsDiscoverable(public_only, hiddenapi_context, &m)) {
530       DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
531       DCHECK(!Runtime::Current()->IsActiveTransaction());
532       ObjPtr<mirror::Method> method =
533           mirror::Method::CreateFromArtMethod<kRuntimePointerSize>(soa.Self(), &m);
534       if (method == nullptr) {
535         soa.Self()->AssertPendingException();
536         return nullptr;
537       }
538       ret->SetWithoutChecks<false>(num_methods++, method);
539     }
540   }
541   return soa.AddLocalReference<jobjectArray>(ret.Get());
542 }
543 
Class_getDeclaredAnnotation(JNIEnv * env,jobject javaThis,jclass annotationClass)544 static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass annotationClass) {
545   ScopedFastNativeObjectAccess soa(env);
546   StackHandleScope<2> hs(soa.Self());
547   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
548   if (klass->IsObsoleteObject()) {
549     ThrowRuntimeException("Obsolete Object!");
550     return nullptr;
551   }
552 
553   // Handle public contract to throw NPE if the "annotationClass" argument was null.
554   if (UNLIKELY(annotationClass == nullptr)) {
555     ThrowNullPointerException("annotationClass");
556     return nullptr;
557   }
558 
559   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
560     return nullptr;
561   }
562   Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationClass)));
563   return soa.AddLocalReference<jobject>(
564       annotations::GetAnnotationForClass(klass, annotation_class));
565 }
566 
Class_getDeclaredAnnotations(JNIEnv * env,jobject javaThis)567 static jobjectArray Class_getDeclaredAnnotations(JNIEnv* env, jobject javaThis) {
568   ScopedFastNativeObjectAccess soa(env);
569   StackHandleScope<1> hs(soa.Self());
570   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
571   if (klass->IsObsoleteObject()) {
572     ThrowRuntimeException("Obsolete Object!");
573     return nullptr;
574   }
575   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
576     // Return an empty array instead of a null pointer.
577     ObjPtr<mirror::Class>  annotation_array_class =
578         WellKnownClasses::ToClass(WellKnownClasses::java_lang_annotation_Annotation__array);
579     ObjPtr<mirror::ObjectArray<mirror::Object>> empty_array =
580         mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(),
581                                                    annotation_array_class,
582                                                    /* length= */ 0);
583     return soa.AddLocalReference<jobjectArray>(empty_array);
584   }
585   return soa.AddLocalReference<jobjectArray>(annotations::GetAnnotationsForClass(klass));
586 }
587 
Class_getDeclaredClasses(JNIEnv * env,jobject javaThis)588 static jobjectArray Class_getDeclaredClasses(JNIEnv* env, jobject javaThis) {
589   ScopedFastNativeObjectAccess soa(env);
590   StackHandleScope<1> hs(soa.Self());
591   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
592   if (klass->IsObsoleteObject()) {
593     ThrowRuntimeException("Obsolete Object!");
594     return nullptr;
595   }
596   ObjPtr<mirror::ObjectArray<mirror::Class>> classes = nullptr;
597   if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) {
598     classes = annotations::GetDeclaredClasses(klass);
599   }
600   if (classes == nullptr) {
601     // Return an empty array instead of a null pointer.
602     if (soa.Self()->IsExceptionPending()) {
603       // Pending exception from GetDeclaredClasses.
604       return nullptr;
605     }
606     ObjPtr<mirror::Class> class_array_class = GetClassRoot<mirror::ObjectArray<mirror::Class>>();
607     DCHECK(class_array_class != nullptr);
608     ObjPtr<mirror::ObjectArray<mirror::Class>> empty_array =
609         mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class, 0);
610     return soa.AddLocalReference<jobjectArray>(empty_array);
611   }
612   return soa.AddLocalReference<jobjectArray>(classes);
613 }
614 
Class_getEnclosingClass(JNIEnv * env,jobject javaThis)615 static jclass Class_getEnclosingClass(JNIEnv* env, jobject javaThis) {
616   ScopedFastNativeObjectAccess soa(env);
617   StackHandleScope<1> hs(soa.Self());
618   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
619   if (klass->IsObsoleteObject()) {
620     ThrowRuntimeException("Obsolete Object!");
621     return nullptr;
622   }
623   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
624     return nullptr;
625   }
626   return soa.AddLocalReference<jclass>(annotations::GetEnclosingClass(klass));
627 }
628 
Class_getEnclosingConstructorNative(JNIEnv * env,jobject javaThis)629 static jobject Class_getEnclosingConstructorNative(JNIEnv* env, jobject javaThis) {
630   ScopedFastNativeObjectAccess soa(env);
631   StackHandleScope<1> hs(soa.Self());
632   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
633   if (klass->IsObsoleteObject()) {
634     ThrowRuntimeException("Obsolete Object!");
635     return nullptr;
636   }
637   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
638     return nullptr;
639   }
640   ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
641   if (method != nullptr) {
642     if (GetClassRoot<mirror::Constructor>() == method->GetClass()) {
643       return soa.AddLocalReference<jobject>(method);
644     }
645   }
646   return nullptr;
647 }
648 
Class_getEnclosingMethodNative(JNIEnv * env,jobject javaThis)649 static jobject Class_getEnclosingMethodNative(JNIEnv* env, jobject javaThis) {
650   ScopedFastNativeObjectAccess soa(env);
651   StackHandleScope<1> hs(soa.Self());
652   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
653   if (klass->IsObsoleteObject()) {
654     ThrowRuntimeException("Obsolete Object!");
655     return nullptr;
656   }
657   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
658     return nullptr;
659   }
660   ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
661   if (method != nullptr) {
662     if (GetClassRoot<mirror::Method>() == method->GetClass()) {
663       return soa.AddLocalReference<jobject>(method);
664     }
665   }
666   return nullptr;
667 }
668 
Class_getInnerClassFlags(JNIEnv * env,jobject javaThis,jint defaultValue)669 static jint Class_getInnerClassFlags(JNIEnv* env, jobject javaThis, jint defaultValue) {
670   ScopedFastNativeObjectAccess soa(env);
671   StackHandleScope<1> hs(soa.Self());
672   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
673   if (klass->IsObsoleteObject()) {
674     ThrowRuntimeException("Obsolete Object!");
675     return 0;
676   }
677   return mirror::Class::GetInnerClassFlags(klass, defaultValue);
678 }
679 
Class_getSimpleNameNative(JNIEnv * env,jobject javaThis)680 static jstring Class_getSimpleNameNative(JNIEnv* env, jobject javaThis) {
681   ScopedFastNativeObjectAccess soa(env);
682   StackHandleScope<3> hs(soa.Self());
683   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
684   if (klass->IsObsoleteObject()) {
685     ThrowRuntimeException("Obsolete Object!");
686     return nullptr;
687   }
688   if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) {
689     ObjPtr<mirror::String> class_name = nullptr;
690     if (annotations::GetInnerClass(klass, &class_name)) {
691       if (class_name == nullptr) {  // Anonymous class
692         ObjPtr<mirror::Class> j_l_String =
693             WellKnownClasses::java_lang_String_EMPTY->GetDeclaringClass();
694         ObjPtr<mirror::Object> empty_string =
695             WellKnownClasses::java_lang_String_EMPTY->GetObject(j_l_String);
696         DCHECK(empty_string != nullptr);
697         return soa.AddLocalReference<jstring>(empty_string);
698       }
699       Handle<mirror::String> h_inner_name(hs.NewHandle<mirror::String>(class_name));
700       if (annotations::GetDeclaringClass(klass) != nullptr ||   // member class
701           annotations::GetEnclosingMethod(klass) != nullptr) {  // local class
702         return soa.AddLocalReference<jstring>(h_inner_name.Get());
703       }
704     }
705   }
706 
707   Handle<mirror::String> h_name(hs.NewHandle<mirror::String>(mirror::Class::ComputeName(klass)));
708   if (h_name == nullptr) {
709     return nullptr;
710   }
711   int32_t dot_index = h_name->LastIndexOf('.');
712   if (dot_index < 0) {
713     return soa.AddLocalReference<jstring>(h_name.Get());
714   }
715   int32_t start_index = dot_index + 1;
716   int32_t length = h_name->GetLength() - start_index;
717   gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
718   return soa.AddLocalReference<jstring>(
719       mirror::String::AllocFromString(soa.Self(), length, h_name, start_index, allocator_type));
720 }
721 
Class_getSignatureAnnotation(JNIEnv * env,jobject javaThis)722 static jobjectArray Class_getSignatureAnnotation(JNIEnv* env, jobject javaThis) {
723   ScopedFastNativeObjectAccess soa(env);
724   StackHandleScope<1> hs(soa.Self());
725   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
726   if (klass->IsObsoleteObject()) {
727     ThrowRuntimeException("Obsolete Object!");
728     return nullptr;
729   }
730   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
731     return nullptr;
732   }
733   return soa.AddLocalReference<jobjectArray>(
734       annotations::GetSignatureAnnotationForClass(klass));
735 }
736 
Class_isAnonymousClass(JNIEnv * env,jobject javaThis)737 static jboolean Class_isAnonymousClass(JNIEnv* env, jobject javaThis) {
738   ScopedFastNativeObjectAccess soa(env);
739   StackHandleScope<1> hs(soa.Self());
740   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
741   if (klass->IsObsoleteObject()) {
742     ThrowRuntimeException("Obsolete Object!");
743     return 0;
744   }
745   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
746     return false;
747   }
748   ObjPtr<mirror::String> class_name = nullptr;
749   if (!annotations::GetInnerClass(klass, &class_name)) {
750     return false;
751   }
752   return class_name == nullptr;
753 }
754 
Class_isRecord0(JNIEnv * env,jobject javaThis)755 static jboolean Class_isRecord0(JNIEnv* env, jobject javaThis) {
756   ScopedFastNativeObjectAccess soa(env);
757   StackHandleScope<1> hs(soa.Self());
758   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
759   return klass->IsRecordClass();
760 }
761 
Class_isDeclaredAnnotationPresent(JNIEnv * env,jobject javaThis,jclass annotationType)762 static jboolean Class_isDeclaredAnnotationPresent(JNIEnv* env, jobject javaThis,
763                                                   jclass annotationType) {
764   ScopedFastNativeObjectAccess soa(env);
765   StackHandleScope<2> hs(soa.Self());
766   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
767   if (klass->IsObsoleteObject()) {
768     ThrowRuntimeException("Obsolete Object!");
769     return false;
770   }
771   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
772     return false;
773   }
774   Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationType)));
775   return annotations::IsClassAnnotationPresent(klass, annotation_class);
776 }
777 
Class_getDeclaringClass(JNIEnv * env,jobject javaThis)778 static jclass Class_getDeclaringClass(JNIEnv* env, jobject javaThis) {
779   ScopedFastNativeObjectAccess soa(env);
780   StackHandleScope<1> hs(soa.Self());
781   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
782   if (klass->IsObsoleteObject()) {
783     ThrowRuntimeException("Obsolete Object!");
784     return nullptr;
785   }
786   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
787     return nullptr;
788   }
789   // Return null for anonymous classes.
790   if (Class_isAnonymousClass(env, javaThis)) {
791     return nullptr;
792   }
793   return soa.AddLocalReference<jclass>(annotations::GetDeclaringClass(klass));
794 }
795 
Class_getNestHostFromAnnotation(JNIEnv * env,jobject javaThis)796 static jclass Class_getNestHostFromAnnotation(JNIEnv* env, jobject javaThis) {
797   ScopedFastNativeObjectAccess soa(env);
798   StackHandleScope<1> hs(soa.Self());
799   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
800   if (klass->IsObsoleteObject()) {
801     ThrowRuntimeException("Obsolete Object!");
802     return nullptr;
803   }
804   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
805     return nullptr;
806   }
807   ObjPtr<mirror::Class> hostClass = annotations::GetNestHost(klass);
808   if (hostClass == nullptr) {
809     return nullptr;
810   }
811   return soa.AddLocalReference<jclass>(hostClass);
812 }
813 
Class_getNestMembersFromAnnotation(JNIEnv * env,jobject javaThis)814 static jobjectArray Class_getNestMembersFromAnnotation(JNIEnv* env, jobject javaThis) {
815   ScopedFastNativeObjectAccess soa(env);
816   StackHandleScope<1> hs(soa.Self());
817   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
818   if (klass->IsObsoleteObject()) {
819     ThrowRuntimeException("Obsolete Object!");
820     return nullptr;
821   }
822   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
823     return nullptr;
824   }
825   ObjPtr<mirror::ObjectArray<mirror::Class>> classes = annotations::GetNestMembers(klass);
826   if (classes == nullptr) {
827     return nullptr;
828   }
829   return soa.AddLocalReference<jobjectArray>(classes);
830 }
831 
Class_getRecordAnnotationElement(JNIEnv * env,jobject javaThis,jstring element_name,jclass array_class)832 static jobjectArray Class_getRecordAnnotationElement(JNIEnv* env,
833                                                      jobject javaThis,
834                                                      jstring element_name,
835                                                      jclass array_class) {
836   ScopedFastNativeObjectAccess soa(env);
837   ScopedUtfChars name(env, element_name);
838   StackHandleScope<2> hs(soa.Self());
839   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
840   if (!(klass->IsRecordClass())) {
841     return nullptr;
842   }
843 
844   Handle<mirror::Class> a_class(hs.NewHandle(DecodeClass(soa, array_class)));
845   ObjPtr<mirror::Object> element_array =
846       annotations::getRecordAnnotationElement(klass, a_class, name.c_str());
847   if (element_array == nullptr || !(element_array->IsObjectArray())) {
848     return nullptr;
849   }
850   return soa.AddLocalReference<jobjectArray>(element_array);
851 }
852 
Class_getPermittedSubclassesFromAnnotation(JNIEnv * env,jobject javaThis)853 static jobjectArray Class_getPermittedSubclassesFromAnnotation(JNIEnv* env, jobject javaThis) {
854   ScopedFastNativeObjectAccess soa(env);
855   StackHandleScope<1> hs(soa.Self());
856   Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
857   if (klass->IsObsoleteObject()) {
858     ThrowRuntimeException("Obsolete Object!");
859     return nullptr;
860   }
861   if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
862     return nullptr;
863   }
864   ObjPtr<mirror::ObjectArray<mirror::Class>> classes = annotations::GetPermittedSubclasses(klass);
865   if (classes == nullptr) {
866     return nullptr;
867   }
868   return soa.AddLocalReference<jobjectArray>(classes);
869 }
870 
Class_ensureExtDataPresent(JNIEnv * env,jobject javaThis)871 static jobject Class_ensureExtDataPresent(JNIEnv* env, jobject javaThis) {
872   ScopedFastNativeObjectAccess soa(env);
873   StackHandleScope<2> hs(soa.Self());
874   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
875 
876   ObjPtr<mirror::Object> extDataPtr =
877     mirror::Class::EnsureExtDataPresent(klass, Thread::Current());
878 
879   return soa.AddLocalReference<jobject>(extDataPtr);
880 }
881 
Class_newInstance(JNIEnv * env,jobject javaThis)882 static jobject Class_newInstance(JNIEnv* env, jobject javaThis) {
883   ScopedFastNativeObjectAccess soa(env);
884   StackHandleScope<4> hs(soa.Self());
885   Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
886   if (klass->IsObsoleteObject()) {
887     ThrowRuntimeException("Obsolete Object!");
888     return nullptr;
889   }
890   if (UNLIKELY(klass->GetPrimitiveType() != 0 || klass->IsInterface() || klass->IsArrayClass() ||
891                klass->IsAbstract())) {
892     soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
893                                    "%s cannot be instantiated",
894                                    klass->PrettyClass().c_str());
895     return nullptr;
896   }
897   auto caller = hs.NewHandle<mirror::Class>(nullptr);
898   // Verify that we can access the class.
899   if (!klass->IsPublic()) {
900     caller.Assign(GetCallingClass(soa.Self(), 1));
901     if (caller != nullptr && !caller->CanAccess(klass.Get())) {
902       soa.Self()->ThrowNewExceptionF(
903           "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
904           klass->PrettyClass().c_str(), caller->PrettyClass().c_str());
905       return nullptr;
906     }
907   }
908   StackArtMethodHandleScope<1> mhs(soa.Self());
909   ReflectiveHandle<ArtMethod> constructor(mhs.NewMethodHandle(klass->GetDeclaredConstructor(
910       soa.Self(), ScopedNullHandle<mirror::ObjectArray<mirror::Class>>(), kRuntimePointerSize)));
911   if (UNLIKELY(constructor == nullptr) || ShouldDenyAccessToMember(constructor.Get(), soa.Self())) {
912     soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
913                                    "%s has no zero argument constructor",
914                                    klass->PrettyClass().c_str());
915     return nullptr;
916   }
917   // Invoke the string allocator to return an empty string for the string class.
918   if (klass->IsStringClass()) {
919     gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
920     ObjPtr<mirror::Object> obj = mirror::String::AllocEmptyString(soa.Self(), allocator_type);
921     if (UNLIKELY(soa.Self()->IsExceptionPending())) {
922       return nullptr;
923     } else {
924       return soa.AddLocalReference<jobject>(obj);
925     }
926   }
927   auto receiver = hs.NewHandle(klass->AllocObject(soa.Self()));
928   if (UNLIKELY(receiver == nullptr)) {
929     soa.Self()->AssertPendingOOMException();
930     return nullptr;
931   }
932   // Verify that we can access the constructor.
933   ObjPtr<mirror::Class> declaring_class = constructor->GetDeclaringClass();
934   if (!constructor->IsPublic()) {
935     if (caller == nullptr) {
936       caller.Assign(GetCallingClass(soa.Self(), 1));
937     }
938     if (UNLIKELY(caller != nullptr && !VerifyAccess(receiver.Get(),
939                                                     declaring_class,
940                                                     constructor->GetAccessFlags(),
941                                                     caller.Get()))) {
942       soa.Self()->ThrowNewExceptionF(
943           "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
944           constructor->PrettyMethod().c_str(), caller->PrettyClass().c_str());
945       return nullptr;
946     }
947   }
948   // Ensure that we are initialized.
949   if (UNLIKELY(!declaring_class->IsVisiblyInitialized())) {
950     Thread* self = soa.Self();
951     Handle<mirror::Class> h_class = hs.NewHandle(declaring_class);
952     if (UNLIKELY(!Runtime::Current()->GetClassLinker()->EnsureInitialized(
953                       self, h_class, /*can_init_fields=*/ true, /*can_init_parents=*/ true))) {
954       DCHECK(self->IsExceptionPending());
955       return nullptr;
956     }
957     DCHECK(h_class->IsInitializing());
958   }
959   // Invoke the constructor.
960   JValue result;
961   uint32_t args[1] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(receiver.Get())) };
962   constructor->Invoke(soa.Self(), args, sizeof(args), &result, "V");
963   if (UNLIKELY(soa.Self()->IsExceptionPending())) {
964     return nullptr;
965   }
966   // Constructors are ()V methods, so we shouldn't touch the result of InvokeMethod.
967   return soa.AddLocalReference<jobject>(receiver.Get());
968 }
969 
970 static JNINativeMethod gMethods[] = {
971   FAST_NATIVE_METHOD(Class, classForName,
972                 "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"),
973   FAST_NATIVE_METHOD(Class, ensureExtDataPresent, "()Ldalvik/system/ClassExt;"),
974   FAST_NATIVE_METHOD(Class, getDeclaredAnnotation,
975                 "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"),
976   FAST_NATIVE_METHOD(Class, getDeclaredAnnotations, "()[Ljava/lang/annotation/Annotation;"),
977   FAST_NATIVE_METHOD(Class, getDeclaredClasses, "()[Ljava/lang/Class;"),
978   FAST_NATIVE_METHOD(Class, getDeclaredConstructorInternal,
979                 "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"),
980   FAST_NATIVE_METHOD(Class, getDeclaredConstructorsInternal, "(Z)[Ljava/lang/reflect/Constructor;"),
981   FAST_NATIVE_METHOD(Class, getDeclaredField, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
982   FAST_NATIVE_METHOD(Class, getPublicFieldRecursive, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
983   FAST_NATIVE_METHOD(Class, getDeclaredFields, "()[Ljava/lang/reflect/Field;"),
984   FAST_NATIVE_METHOD(Class, getDeclaredFieldsUnchecked, "(Z)[Ljava/lang/reflect/Field;"),
985   FAST_NATIVE_METHOD(Class, getDeclaredMethodInternal,
986                 "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"),
987   FAST_NATIVE_METHOD(Class, getDeclaredMethodsUnchecked,
988                 "(Z)[Ljava/lang/reflect/Method;"),
989   FAST_NATIVE_METHOD(Class, getDeclaringClass, "()Ljava/lang/Class;"),
990   FAST_NATIVE_METHOD(Class, getEnclosingClass, "()Ljava/lang/Class;"),
991   FAST_NATIVE_METHOD(Class, getEnclosingConstructorNative, "()Ljava/lang/reflect/Constructor;"),
992   FAST_NATIVE_METHOD(Class, getEnclosingMethodNative, "()Ljava/lang/reflect/Method;"),
993   FAST_NATIVE_METHOD(Class, getInnerClassFlags, "(I)I"),
994   FAST_NATIVE_METHOD(Class, getInterfacesInternal, "()[Ljava/lang/Class;"),
995   FAST_NATIVE_METHOD(Class, getPrimitiveClass, "(Ljava/lang/String;)Ljava/lang/Class;"),
996   FAST_NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
997   FAST_NATIVE_METHOD(Class, getNestHostFromAnnotation, "()Ljava/lang/Class;"),
998   FAST_NATIVE_METHOD(Class, getNestMembersFromAnnotation, "()[Ljava/lang/Class;"),
999   FAST_NATIVE_METHOD(Class, getPermittedSubclassesFromAnnotation, "()[Ljava/lang/Class;"),
1000   FAST_NATIVE_METHOD(Class, getPublicDeclaredFields, "()[Ljava/lang/reflect/Field;"),
1001   FAST_NATIVE_METHOD(Class, getRecordAnnotationElement, "(Ljava/lang/String;Ljava/lang/Class;)[Ljava/lang/Object;"),
1002   FAST_NATIVE_METHOD(Class, getSignatureAnnotation, "()[Ljava/lang/String;"),
1003   FAST_NATIVE_METHOD(Class, getSimpleNameNative, "()Ljava/lang/String;"),
1004   FAST_NATIVE_METHOD(Class, isAnonymousClass, "()Z"),
1005   FAST_NATIVE_METHOD(Class, isDeclaredAnnotationPresent, "(Ljava/lang/Class;)Z"),
1006   FAST_NATIVE_METHOD(Class, isRecord0, "()Z"),
1007   FAST_NATIVE_METHOD(Class, newInstance, "()Ljava/lang/Object;"),
1008 };
1009 
register_java_lang_Class(JNIEnv * env)1010 void register_java_lang_Class(JNIEnv* env) {
1011   REGISTER_NATIVE_METHODS("java/lang/Class");
1012 }
1013 
1014 }  // namespace art
1015