summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/native/java_lang_reflect_Constructor.cc4
-rw-r--r--test/100-reflect2/src/Main.java17
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();
}
}