美元符号后跟一个索引在类名中代表什么意思?

6

我正在对一款Java应用程序进行分析,分配最多的对象中有一个名称为com.x.y.ClassName$5

NetBeans Profiler和YourKit使用相同的命名约定。我不知道如何在谷歌上搜索这个命名问题。

类名后面的$5是什么意思?

编辑: 似乎$5是第五个匿名类声明。我在生成的类上使用了javap来查找第五个匿名类。参考资料可以在 How to match compiled class name to an enum member in Java? 中找到。

2个回答

19

com.x.y.ClassName$5 表示 "在 com.x.y.ClassName 中的第五个匿名内部类"


哇,回答得真快。有没有办法告诉我哪个内部类是第5个? - bbaja42
我不知道有任何方法可以做到那样。所以我对自己的答案不满意。如果没有指明具体顺序,说“第五个”就像是在说“一个随机数”。然而,如果你有一个好的反编译器比如JD,就可以显示任何内部类的代码。 - Pablo Grisafi
1
我认为它是按照声明的顺序排列的... 无论如何,你可以重写toString()来在调试器中提供一些有意义的表示。 - fortran
@fortran toString方法会如何改变类名? - bbaja42
1
@bbaja42 它不会改变类名,但在大多数IDE中,如果将鼠标悬停在实时对象上,它将显示其toString()表示(默认情况下为类名和一些哈希值)。 - fortran

1

以下是一些链接可以帮助你。同时请查看polygenelubricant的回答。

当你的类包含一个匿名内部类时,你会得到com.x.y.ClassName$5

    sample8.class
    sample8$1.class
    sample8$2.class
    sample8$klass.class
    sample8$klass$1.class

例子

   public class sample8 {


        private class klass{
            void vodka() {
                sample8 _s = new sample8() {

                };

            }
        }
        sample8() {
               klass _k = new klass();
              _k.vodka();
           }


    public static void main(String args[])
    {
    }

    sample8 _s = new sample8() {

    };

    sample8 _s1 = new sample8() {

    };
}

1
据我所知,这将导致 ClassName$klass,而不是 ClassName$<a number>。 - Mark Rotteveel
谢谢Mark,你是正确的。如果有一个匿名内部类,它会创建一个。 - Dead Programmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接