| Duplicate :   | |
| Duplicate :   | |
| Relates :   | 
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 ----------
| 
 |