-
Bug
-
Resolution: Fixed
-
P3
-
5.0, 6, 7, 8, 9
-
b142
-
generic
-
generic
-
Verified
FULL PRODUCT VERSION :
java version "1.5.0_04"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode, sharing)
1.5.0_06-b05
1.6.0-rc-b68
A DESCRIPTION OF THE PROBLEM :
A subclass can't access its superclass's protected fields and methods by reflection.
Although I don't know the specification, I think there is a bug in sun.reflect.Reflection#verifyMemberAccess() method (sun/reflect/Reflection.java:142). I think the order of isSubclassOf() method's arguments is incorrect.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac b\SubClass.java
java b.SubClass
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
a.SuperClass.protectedStaticField
a.SuperClass.protectedStaticField
a.SuperClass.protectedStaticMethod()
a.SuperClass.protectedStaticMethod()
ACTUAL -
a.SuperClass.protectedStaticField
java.lang.IllegalAccessException: Class b.SubClass can not access a member of class a.SuperClass with modifiers "protected 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 b.SubClass.main(SubClass.java:8)
a.SuperClass.protectedStaticMethod()
java.lang.IllegalAccessException: Class b.SubClass can not access a member of class a.SuperClass with modifiers "protected static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:578)
at b.SubClass.main(SubClass.java:17)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
-----
package a;
public class SuperClass {
protected static String protectedStaticField = "a.SuperClass.protectedStaticField";
protected static void protectedStaticMethod() {
System.out.println("a.SuperClass.protectedStaticMethod()");
}
}
-----
package b;
public class SubClass extends a.SuperClass {
public static void main(String[] args) {
System.out.println(protectedStaticField);
try {
System.out.println(a.SuperClass.class.getDeclaredField("protectedStaticField").get(null));
} catch (Exception e) {
e.printStackTrace();
}
//Runtime Exception
protectedStaticMethod();
try {
a.SuperClass.class.getDeclaredMethod("protectedStaticMethod").invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
//Runtime Exception
}
}
-----
---------- END SOURCE ----------
java version "1.5.0_04"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode, sharing)
1.5.0_06-b05
1.6.0-rc-b68
A DESCRIPTION OF THE PROBLEM :
A subclass can't access its superclass's protected fields and methods by reflection.
Although I don't know the specification, I think there is a bug in sun.reflect.Reflection#verifyMemberAccess() method (sun/reflect/Reflection.java:142). I think the order of isSubclassOf() method's arguments is incorrect.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac b\SubClass.java
java b.SubClass
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
a.SuperClass.protectedStaticField
a.SuperClass.protectedStaticField
a.SuperClass.protectedStaticMethod()
a.SuperClass.protectedStaticMethod()
ACTUAL -
a.SuperClass.protectedStaticField
java.lang.IllegalAccessException: Class b.SubClass can not access a member of class a.SuperClass with modifiers "protected 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 b.SubClass.main(SubClass.java:8)
a.SuperClass.protectedStaticMethod()
java.lang.IllegalAccessException: Class b.SubClass can not access a member of class a.SuperClass with modifiers "protected static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at java.lang.reflect.Method.invoke(Method.java:578)
at b.SubClass.main(SubClass.java:17)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
-----
package a;
public class SuperClass {
protected static String protectedStaticField = "a.SuperClass.protectedStaticField";
protected static void protectedStaticMethod() {
System.out.println("a.SuperClass.protectedStaticMethod()");
}
}
-----
package b;
public class SubClass extends a.SuperClass {
public static void main(String[] args) {
System.out.println(protectedStaticField);
try {
System.out.println(a.SuperClass.class.getDeclaredField("protectedStaticField").get(null));
} catch (Exception e) {
e.printStackTrace();
}
//Runtime Exception
protectedStaticMethod();
try {
a.SuperClass.class.getDeclaredMethod("protectedStaticMethod").invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
//Runtime Exception
}
}
-----
---------- END SOURCE ----------
- duplicates
-
JDK-6966679 (reflect) Incorrect argument order in sun.reflect.Reflection#verifyMemberAccess()
-
- Closed
-
-
JDK-4032740 (Reflection)Accessibilities of members should be ACCESS-LEVEL sensitive.
-
- Closed
-
- relates to
-
JDK-6342411 Add bridge method to allow reflective access to public method in non-public class
-
- Closed
-