Move Object.registerNatives into HotSpot

XMLWordPrintable

    • behavioral
    • minimal
    • Java API
    • Implementation

      Summary

      IllegalAccessError will not be thrown when resolving a default method named registerNatives() method. Previously IAE was thrown because private native Object::registerNatives method was selected in method resolution.

      Problem

      Consider this Java program:

      public class RegisterNatives {
          interface I {
              default public void registerNatives() { 
                  System.out.println("I");
              }
          }
          static class A implements I { }
          public static void main(String... args) {
            A varA = new A();
            varA.registerNatives();
          }
      }
      

      Previously, this would throw an IllegalAccessError due the resolution logic giving priority to a private registerNatives method declared in Object rather than the default method in interface I:

      Exception in thread "main" java.lang.IllegalAccessError: class RegisterNatives tried to access private method 'void java.lang.Object.registerNatives()'
       (RegisterNatives is in unnamed module of loader 'app'; java.lang.Object is in module java.base of loader 'bootstrap')
              at RegisterNatives.main(RegisterNatives.java:6)
      

      When the private Object::registerNatives method is removed, the method resolution A::registerNatives will resolve successfully to the default method I::registerNatives.

      Solution

      The behavioral change does not have any compatibility risk since the previous behavior results in an error.

      Specification

      No spec change.

            Assignee:
            Claes Redestad
            Reporter:
            Claes Redestad
            David Holmes, Mandy Chung (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: