summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/reflection.cc12
-rw-r--r--runtime/well_known_classes.cc6
-rw-r--r--runtime/well_known_classes.h2
3 files changed, 12 insertions, 8 deletions
diff --git a/runtime/reflection.cc b/runtime/reflection.cc
index 0dbec85c02..edd92da65c 100644
--- a/runtime/reflection.cc
+++ b/runtime/reflection.cc
@@ -497,14 +497,10 @@ bool InvokeMethodImpl(const ScopedObjectAccessAlreadyRunnable& soa,
// 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 db90ae82cf..279b45b755 100644
--- a/runtime/well_known_classes.cc
+++ b/runtime/well_known_classes.cc
@@ -61,6 +61,7 @@ jclass WellKnownClasses::java_lang_IllegalAccessError;
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_invoke_MethodHandles_Lookup_findConstructo
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 @@ void WellKnownClasses::Init(JNIEnv* env) {
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 @@ void WellKnownClasses::Init(JNIEnv* env) {
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 @@ void WellKnownClasses::Clear() {
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 @@ void WellKnownClasses::Clear() {
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 3c5144fbd5..d7acd5789f 100644
--- a/runtime/well_known_classes.h
+++ b/runtime/well_known_classes.h
@@ -70,6 +70,7 @@ struct WellKnownClasses {
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 @@ struct WellKnownClasses {
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;