Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8136614

Accessibility bridges are not created for default methods

    Details

    • Type: Bug
    • Status: Open
    • Priority: P4
    • Resolution: Unresolved
    • Affects Version/s: 8, 9
    • Fix Version/s: tbd_major
    • Component/s: tools
    • Labels:
    • Subcomponent:
    • Introduced In Version:
      8
    • CPU:
      x86
    • OS:
      generic

      Description

      FULL PRODUCT VERSION :
      java full version "1.8.0_60-b27"

      ADDITIONAL OS VERSION INFORMATION :
      Darwin x86_64

      A DESCRIPTION OF THE PROBLEM :
      To work around JDK-6342411, javac emits "accessibility" bridges when public methods are inherited from non-public superclasses into public derived classes.

      Accessibility bridges are not emitted for defender methods, leading to spurious java.lang.IllegalAccessException when those methods are invoked reflectively on the derived class.

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      javac Test.java pkg/A.java pkg/B.java
      java Test

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      I expected the program to print "hi".
      ACTUAL -
      The program failed with an IllegalAccessException.

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in thread "main" java.lang.IllegalAccessException: Class Test can not access a member of class pkg.A with modifiers "public"
      at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
      at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
      at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
      at java.lang.reflect.Method.invoke(Method.java:490)
      at Test.main(Test.java:3)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      === pkg/A.java
      package pkg;
      interface A {
        default public void f() {
          System.err.println("hi");
        }
      }
      === pkg/B.java
      package pkg;
      public class B implements A {}
      === Test.java
      class Test {
        public static void main(String[] args) throws Exception {
          Class.forName("pkg.A").getMethod("f").invoke(new pkg.B(), new Object[]{});
        }
      }
      ===
      ---------- END SOURCE ----------

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                sadayapalam Srikanth Adayapalam
                Reporter:
                webbuggrp Webbug Group
              • Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated: