经过编译的Java类包含美元符号(java compiled classes contain dol

2019-06-14 18:01发布

我一直在使用Eclipse作为我的开发IDE。 我还用它来我的应用程序导出到一个.jar文件。 当我在.jar文件看我的班,我的几个类包含类,一个美元符号,然后一个数字的名称。 例:

  • 查找$ 1.class
  • 查找$ 2.class
  • 查找$ 3.class
  • Find.class

我发现它这样做的更大类。 这是因为类弄这么大,它编译成多个类? 我一派,并期待在多个论坛,并搜索Java文档,但没有发现任何东西,甚至关系到它。 可能有人解释一下吗?

Answer 1:

内部类,如果存在的任何类,将被编译和类文件将ClassName$InnerClassName 。 在匿名内部类的情况下,它会显示为数字。 类(Java代码的)的大小不会导致产生多个类的。

例如给定的这一段代码:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

这将生成的类将是:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

更新:

使用匿名类不被认为是不好的做法,它只是取决于使用情况。

检查这对SO讨论



Answer 2:

这是因为你有这样大的类中的匿名类。 他们开始使用此命名约定编译。

见匿名类难题



Answer 3:

除了由@mprabhat提出的上述情况,其他情况下可能是:

  1. 如果类包含一个枚举变量将为该生成一个单独的类了。 生成的.class的名称将是类名$ Name_of_enum。
  2. 如果你的类X被继承,即扩展另一个类Y,然后会有一个名为类名$ 1.class类名$ 1 $ 1.class产生一个.class
  3. 如果你的类X的实现一个接口Y,然后会有一个名为类名$ 1.class类名$ 1 $ 1.class产生一个.class。

这些案件是我在罐子.class文件检查的推导。



Answer 4:

为了回答您的评论的都是匿名类坏。 他们是最绝对不是。 认为这是一个动作监听分配给一个JButton:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

或本由“名称”属性做一个区分大小写的排序

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

您还可以看到很多的Runnable和赎回进行匿名类。



文章来源: java compiled classes contain dollar signs