diff options
Diffstat (limited to 'runtime/native/java_lang_reflect_Field.cc')
-rw-r--r-- | runtime/native/java_lang_reflect_Field.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/runtime/native/java_lang_reflect_Field.cc b/runtime/native/java_lang_reflect_Field.cc index 14c6d3879c..d166be030a 100644 --- a/runtime/native/java_lang_reflect_Field.cc +++ b/runtime/native/java_lang_reflect_Field.cc @@ -33,13 +33,24 @@ ALWAYS_INLINE inline static bool VerifyFieldAccess(Thread* self, mirror::ArtFiel mirror::Object* obj) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { if (kIsSet && field->IsFinal()) { - ThrowIllegalAccessException(nullptr, StringPrintf("Cannot set final field: %s", - PrettyField(field).c_str()).c_str()); + ThrowIllegalAccessException(nullptr, + StringPrintf("Cannot set %s field %s of class %s", + PrettyJavaAccessFlags(field->GetAccessFlags()).c_str(), + PrettyField(field).c_str(), + field->GetDeclaringClass() == nullptr ? "null" : + PrettyClass(field->GetDeclaringClass()).c_str()).c_str()); return false; } - if (!VerifyAccess(self, obj, field->GetDeclaringClass(), field->GetAccessFlags())) { - ThrowIllegalAccessException(nullptr, StringPrintf("Cannot access field: %s", - PrettyField(field).c_str()).c_str()); + mirror::Class* calling_class = nullptr; + if (!VerifyAccess(self, obj, field->GetDeclaringClass(), field->GetAccessFlags(), + &calling_class)) { + ThrowIllegalAccessException(nullptr, + StringPrintf("Class %s cannot access %s field %s of class %s", + calling_class == nullptr ? "null" : PrettyClass(calling_class).c_str(), + PrettyJavaAccessFlags(field->GetAccessFlags()).c_str(), + PrettyField(field).c_str(), + field->GetDeclaringClass() == nullptr ? "null" : + PrettyClass(field->GetDeclaringClass()).c_str()).c_str()); return false; } return true; |