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