diff options
-rw-r--r-- | runtime/native/java_lang_reflect_Constructor.cc | 4 | ||||
-rw-r--r-- | test/100-reflect2/src/Main.java | 17 |
2 files changed, 17 insertions, 4 deletions
diff --git a/runtime/native/java_lang_reflect_Constructor.cc b/runtime/native/java_lang_reflect_Constructor.cc index 036d04e..0fd6759 100644 --- a/runtime/native/java_lang_reflect_Constructor.cc +++ b/runtime/native/java_lang_reflect_Constructor.cc @@ -36,7 +36,7 @@ namespace art { */ static jobject Constructor_newInstance(JNIEnv* env, jobject javaMethod, jobjectArray javaArgs) { ScopedFastNativeObjectAccess soa(env); - mirror::Method* m = soa.Decode<mirror::Method*>(javaMethod); + mirror::Constructor* m = soa.Decode<mirror::Constructor*>(javaMethod); StackHandleScope<1> hs(soa.Self()); Handle<mirror::Class> c(hs.NewHandle(m->GetDeclaringClass())); if (UNLIKELY(c->IsAbstract())) { @@ -46,7 +46,7 @@ static jobject Constructor_newInstance(JNIEnv* env, jobject javaMethod, jobjectA return nullptr; } // Verify that we can access the class. - if (!c->IsPublic()) { + if (!m->IsAccessible() && !c->IsPublic()) { auto* caller = GetCallingClass(soa.Self(), 1); // If caller is null, then we called from JNI, just avoid the check since JNI avoids most // access checks anyways. TODO: Investigate if this the correct behavior. diff --git a/test/100-reflect2/src/Main.java b/test/100-reflect2/src/Main.java index 86a5ef8..72e14b1 100644 --- a/test/100-reflect2/src/Main.java +++ b/test/100-reflect2/src/Main.java @@ -266,7 +266,7 @@ class Main { show(ctor.newInstance(new char[] { 'x', 'y', 'z', '!' }, 1, 2)); } - private static void testPackagePrivate() { + private static void testPackagePrivateConstructor() { try { Class<?> c = Class.forName("sub.PPClass"); Constructor cons = c.getConstructor(); @@ -280,10 +280,23 @@ class Main { } } + private static void testPackagePrivateAccessibleConstructor() { + try { + Class<?> c = Class.forName("sub.PPClass"); + Constructor cons = c.getConstructor(); + cons.setAccessible(true); // ensure we prevent IllegalAccessException + cons.newInstance(); + } catch (Exception e) { + // Error. + e.printStackTrace(); + } + } + public static void main(String[] args) throws Exception { testFieldReflection(); testMethodReflection(); testConstructorReflection(); - testPackagePrivate(); + testPackagePrivateConstructor(); + testPackagePrivateAccessibleConstructor(); } } |