Add InvocationTargetException to Wellknownclasses
To simplify reflection code and eliminate a possible infinite loop
issue if encoding a jmethodID takes memory I added
j.l.r.InvocationTargetException and its constructor to
WellKnownClasses.
Test: ./test.py --host
Bug: 134162467
Change-Id: I77d3905e8e738820c9451decb88ac39df6fcefa7
diff --git a/runtime/reflection.cc b/runtime/reflection.cc
index 0dbec85..edd92da 100644
--- a/runtime/reflection.cc
+++ b/runtime/reflection.cc
@@ -497,14 +497,10 @@
// If we get another exception when we are trying to wrap, then just use that instead.
ScopedLocalRef<jthrowable> th(soa.Env(), soa.Env()->ExceptionOccurred());
soa.Self()->ClearException();
- jclass exception_class = soa.Env()->FindClass("java/lang/reflect/InvocationTargetException");
- if (exception_class == nullptr) {
- soa.Self()->AssertPendingException();
- return false;
- }
- jmethodID mid = soa.Env()->GetMethodID(exception_class, "<init>", "(Ljava/lang/Throwable;)V");
- CHECK(mid != nullptr);
- jobject exception_instance = soa.Env()->NewObject(exception_class, mid, th.get());
+ jobject exception_instance =
+ soa.Env()->NewObject(WellKnownClasses::java_lang_reflect_InvocationTargetException,
+ WellKnownClasses::java_lang_reflect_InvocationTargetException_init,
+ th.get());
if (exception_instance == nullptr) {
soa.Self()->AssertPendingException();
return false;
diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc
index db90ae8..279b45b 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -61,6 +61,7 @@
jclass WellKnownClasses::java_lang_NoClassDefFoundError;
jclass WellKnownClasses::java_lang_Object;
jclass WellKnownClasses::java_lang_OutOfMemoryError;
+jclass WellKnownClasses::java_lang_reflect_InvocationTargetException;
jclass WellKnownClasses::java_lang_reflect_Parameter;
jclass WellKnownClasses::java_lang_reflect_Parameter__array;
jclass WellKnownClasses::java_lang_reflect_Proxy;
@@ -101,6 +102,7 @@
jmethodID WellKnownClasses::java_lang_Long_valueOf;
jmethodID WellKnownClasses::java_lang_ref_FinalizerReference_add;
jmethodID WellKnownClasses::java_lang_ref_ReferenceQueue_add;
+jmethodID WellKnownClasses::java_lang_reflect_InvocationTargetException_init;
jmethodID WellKnownClasses::java_lang_reflect_Parameter_init;
jmethodID WellKnownClasses::java_lang_reflect_Proxy_init;
jmethodID WellKnownClasses::java_lang_reflect_Proxy_invoke;
@@ -324,6 +326,7 @@
java_lang_Error = CacheClass(env, "java/lang/Error");
java_lang_IllegalAccessError = CacheClass(env, "java/lang/IllegalAccessError");
java_lang_NoClassDefFoundError = CacheClass(env, "java/lang/NoClassDefFoundError");
+ java_lang_reflect_InvocationTargetException = CacheClass(env, "java/lang/reflect/InvocationTargetException");
java_lang_reflect_Parameter = CacheClass(env, "java/lang/reflect/Parameter");
java_lang_reflect_Parameter__array = CacheClass(env, "[Ljava/lang/reflect/Parameter;");
java_lang_reflect_Proxy = CacheClass(env, "java/lang/reflect/Proxy");
@@ -360,6 +363,7 @@
java_lang_ref_FinalizerReference_add = CacheMethod(env, "java/lang/ref/FinalizerReference", true, "add", "(Ljava/lang/Object;)V");
java_lang_ref_ReferenceQueue_add = CacheMethod(env, "java/lang/ref/ReferenceQueue", true, "add", "(Ljava/lang/ref/Reference;)V");
+ java_lang_reflect_InvocationTargetException_init = CacheMethod(env, java_lang_reflect_InvocationTargetException, false, "<init>", "(Ljava/lang/Throwable;)V");
java_lang_reflect_Parameter_init = CacheMethod(env, java_lang_reflect_Parameter, false, "<init>", "(Ljava/lang/String;ILjava/lang/reflect/Executable;I)V");
java_lang_String_charAt = CacheMethod(env, java_lang_String, false, "charAt", "(I)C");
java_lang_Thread_dispatchUncaughtException = CacheMethod(env, java_lang_Thread, false, "dispatchUncaughtException", "(Ljava/lang/Throwable;)V");
@@ -470,6 +474,7 @@
java_lang_NoClassDefFoundError = nullptr;
java_lang_Object = nullptr;
java_lang_OutOfMemoryError = nullptr;
+ java_lang_reflect_InvocationTargetException = nullptr;
java_lang_reflect_Parameter = nullptr;
java_lang_reflect_Parameter__array = nullptr;
java_lang_reflect_Proxy = nullptr;
@@ -508,6 +513,7 @@
java_lang_Long_valueOf = nullptr;
java_lang_ref_FinalizerReference_add = nullptr;
java_lang_ref_ReferenceQueue_add = nullptr;
+ java_lang_reflect_InvocationTargetException_init = nullptr;
java_lang_reflect_Parameter_init = nullptr;
java_lang_reflect_Proxy_init = nullptr;
java_lang_reflect_Proxy_invoke = nullptr;
diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h
index 3c5144f..d7acd57 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -70,6 +70,7 @@
static jclass java_lang_NoClassDefFoundError;
static jclass java_lang_Object;
static jclass java_lang_OutOfMemoryError;
+ static jclass java_lang_reflect_InvocationTargetException;
static jclass java_lang_reflect_Parameter;
static jclass java_lang_reflect_Parameter__array;
static jclass java_lang_reflect_Proxy;
@@ -110,6 +111,7 @@
static jmethodID java_lang_Long_valueOf;
static jmethodID java_lang_ref_FinalizerReference_add;
static jmethodID java_lang_ref_ReferenceQueue_add;
+ static jmethodID java_lang_reflect_InvocationTargetException_init;
static jmethodID java_lang_reflect_Parameter_init;
static jmethodID java_lang_reflect_Proxy_init;
static jmethodID java_lang_reflect_Proxy_invoke;