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

JDI - VirtualMachine.allClasses() does not return loaded but uninitialized class

XMLWordPrintable

      VirtualMachine.allClasses() does not return a loaded class when the class is
      not initialized. This prevents reloading of the uninitialized class in our
      application.

      Consider the test case:

      public class Main {
       public static void foo(Foo f) {
       }

       public static void main(String[] args) throws ClassNotFoundException {
         //load class, but don't initialize it
         Class.forName("Foo", false, Main.class.getClassLoader());
         //alternative: call Main.class.getMethods();
         new Foo().bar(); // breakpoint here
       }

      }

      class Foo {
       static {
         System.out.println("Foo initialized");
       }

       void bar() {
         System.out.println("yy");
       }
      }

      When debugger stops at breakpoint, where Foo is loaded but not initialized,
      VirtualMachine.allClasses() does not contain a class Foo as it should,
      according to
      https://docs.oracle.com/javase/8/docs/jdk/api/jpda/jdi/com/sun/jdi/VirtualMachine.html#allClasses()

      jdk1.8.0_131\bin\jdb" Main
      Initializing jdb ...
      > stop at Main:9
      Deferring breakpoint Main:9.
      It will be set after the class is loaded.
      > run
      run Main
      Set uncaught java.lang.Throwable
      Set deferred uncaught java.lang.Throwable
      >
      VM Started: Set deferred breakpoint Main:9

      Breakpoint hit: "thread=main", Main.main(), line=9 bci=12
      9 new Foo().bar(); // breakpoint here

      main[1] class Foo
      "Foo" is not a valid id or class name.
      main[1]

      It's not until we initialize Foo that it is then returned by
      VirtualMachine.allClasses():

      main[1] step
      >
      Step completed: "thread=main", Foo.<clinit>(), line=16 bci=0
      16 System.out.println("Foo initialized");

      main[1] class Foo
      Class: Foo
      extends: java.lang.Object

            sspitsyn Serguei Spitsyn
            shadowbug Shadow Bug
            Votes:
            0 Vote for this issue
            Watchers:
            12 Start watching this issue

              Created:
              Updated:
              Resolved: