Jochen,

Let me elaborate on that topic a bit.

There are 5 types of classes mentioned in JVMS:
  - top-level
  - nested
  - inner
  - local
  - anonymous

Example:
class TopLevel {
  static class Nested {}
  class        Inner  {}

  void f() {
    class Local {}
  }
  Object o = new TopLevel() {}; // anonymous
}

And here's how they look like on bytecode level.

I'll use both javap and ASM to dump class structure:
  $ java jdk.internal.org.objectweb.asm.util.ASMifier <class_file>

Nested:
javap: static #11= #10 of #5; //Nested=class TopLevel$Nested of class TopLevel asm: cw.visitInnerClass("TopLevel$Nested", "TopLevel", "Nested", ACC_STATIC);

Inner:
  javap: #8= #7 of #5; //Inner=class TopLevel$Inner of class TopLevel
  asm: cw.visitInnerClass("TopLevel$Inner", "TopLevel", "Inner", 0);

Local:
  javap: #13= #12; //Local=class TopLevel$1Local
  asm: cw.visitInnerClass("TopLevel$1Local", null, "Local", 0);

Anonymous:
  javap: #2; //class TopLevel$1
  asm: cw.visitInnerClass("TopLevel$1", null, null, 0);

TopLevel.class contains all aforementioned attributes.

Best regards,
Vladimir Ivanov

On 6/16/15 7:29 AM, Jochen Theodorou wrote:
Am 15.06.2015 18:04, schrieb Vladimir Ivanov:
[...]
In order to make the class non-anonymous again, you have to specify
inner_name_index and, optionally, outer_class_info_index.

ok... let me try to understand this better... taking this Java source

public class Test {
public static void main(String[] args) {
  class X{}
  Runnable foo = new Runnable(){public void run(){}};
}}

I get for Test

InnerClasses:
     static #2; //class Test$1
     #12= #11; //X=class Test$1X

Is it the #12=#11 part which tells me X is no anonymous class? Is #11
the inner_name_index?

bye Jochen

Reply via email to