Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Fixed
-
None
-
None
-
None
Description
There is a test[1] in classlib, which verifies that reflection access
from enclosing class to a private member of a nested class results in
IllegalAccessException.
However, this is against the language specification (para 6.6.1 of the JLS3):
"if the member or constructor is declared private, then access is
permitted if and only if it occurs within the body of the top level class (7.6)
that encloses the declaration of the member or constructor."
Moreover, the following test reveals inconsistency between standard
access control and reflective one:
---------------------------------
class NestedAccessTest {
static class A {
private static int x = 123;
}
public static void main(String... s) throws Throwable{
System.out.println(A.x);
System.out.println(A.class.getDeclaredField("x").get(null));
}
}
--------------------------------
>java -showversion NestedAccessTest
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
123
Exception in thread "main" java.lang.IllegalAccessException: Class
NestedAccessTest can not access a member of class NestedAccessTest$A
with modifiers "private static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Field.doSecurityCheck(Field.java:954)
at java.lang.reflect.Field.getFieldAccessor(Field.java:895)
at java.lang.reflect.Field.get(Field.java:357)
at NestedAccessTest.main(NestedAccessTest.java:7)
----------------------------------
Besides, this is an acknowledged bug of RI [2], and is ranked TOP#6.
[1]<testcase classname="tests.api.java.lang.reflect.FieldTest"
name="test_getLjava_lang_Object"/>
[2] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
Attachments
Attachments
Issue Links
- is related to
-
HARMONY-3632 [drlvm][kernel] Drlvm does not allow to call public constructor of 'private static' inner class from within another class
- Closed