【问题标题】:What means java filenames with a dollar sign and a number .class in it (name$1.class)? [duplicate]什么是带有美元符号和数字 .class 的 java 文件名(名称 $1.class)? [复制]
【发布时间】:2013-10-07 16:55:48
【问题描述】:

当我编译我的 java Enum Day 时,它会生成他的 Day.class 文件和 8 Day$#.class 文件,所以我想知道为什么编译器生成 8 $#.class 而不是 7,因为我有 7 个枚举常量,但是 8 个覆盖注释,我知道 Dollar.class 文件是为每个内部类或枚举常量生成的,但是八个 .class 文件是为了什么而生成的呢?

package com.kaissersoft.test.objective.one.three.enums;

public enum Day{
    SUNDAY(01){
    @Override
    public void salute(){
        System.out.println("Today is Sunday");
    }
},
MONDAY(02){
    @Override
    public void salute(){
        System.out.println("Today is Monday");
    } 
},
TUESDAY(03){
    @Override
    public void salute(){
        System.out.println("Today is Tuesday");
    }
},
WEDNESDAY(04){
    @Override 
    public void salute(){
        System.out.println("Today is Wednesday");
    }
},
THURSDAY(05){
    @Override
    public void salute(){
        System.out.println("Today is Thursday");
    }
},
FRIDAY(06){
    @Override
    public void salute(){
        System.out.println("Today is Friday");
    }
},
SATURDAY(07){
    @Override
    public void salute(){
        System.out.println("Today is Saturday");
    }
};

int dayNumber;
Day(final int day){
    dayNumber = day;
}

public int getDayNumber(){
    return dayNumber;
}

@Override
public String toString(){

    switch(this){
        case SUNDAY:
            System.out.println("Sunday("+this.getDayNumber()+")");
            break;
        case MONDAY:
            System.out.println("Monday("+this.getDayNumber()+")");
            break;
        case TUESDAY:
            System.out.println("Tuesday"+this.getDayNumber()+")");
            break;
        case WEDNESDAY:
            System.out.println("Wednesday("+this.getDayNumber()+")");
            break;
        case THURSDAY:
            System.out.println("Thursday("+this.getDayNumber()+")");
            break;
        case FRIDAY:
            System.out.println("Friday("+this.getDayNumber()+")");
            break;
        case SATURDAY:
            System.out.println("Saturday("+this.getDayNumber()+")");
            break;
    }
    return super.toString();
}

//Abstract method to the day Salute
public abstract void salute();
}

它会生成这个:

  • Day.class
  • Day$1.class
  • Day$2.class
  • Day$3.class
  • Day$4.class
  • Day$5.class
  • Day$6.class
  • Day$7.class
  • Day$8.class

【问题讨论】:

  • @SotiriosDelimanolis 不是真的,这里的绅士知道名称中带有美元符号的类是什么,他在问别的事情。
  • (你知道你在那里使用八进制常量吗?)
  • 我在玩编译器,我在 toString 覆盖中减去了开关,它生成了 7 个 .class 文件,所以我假设八个是由 enum 开关生成的?有人知道这是否是答案吗?
  • @SotiriosDelimanolis 是的,我只要求八个 .class 文件
  • 你的答案在这里:stackoverflow.com/questions/1834632/…

标签: java class enums overriding inner-classes


【解决方案1】:

通过每个 Enum 字面量生成一个由 Enum 的名称加上枚举字面量的索引标识的类,所有这些都与 Enum 生成的类分开,带有后缀 8 的枚举类是一个名为 SwitchMap 的映射,它是一个维护开关使用的枚举文字索引的引用的映射,如果您执行此代码,您可以看到它。

        try{
             Class< ? > c = Class.forName( "com.kaissersoft.test.objective.one.three.enums.Days$8" );

            Field[] fs= c.getDeclaredFields();
            for( Field f: fs ){
           System.out.println( f.toString() );
            }
        }catch( ClassNotFoundException cne){
          cne.printStackTrace();
        }


// Output
static final int[] com.kaissersoft.test.objective.one.three.enums.Days$8.$Switch
Map$com$kaissersoft$test$objective$one$three$enums$Days

【讨论】:

    【解决方案2】:

    我刚刚复制并编译了你的代码,我的机器上的结果如下:

    • Day.class
    • Day$1.class
    • Day$2.class
    • Day$3.class
    • Day$4.class
    • Day$5.class
    • Day$6.class
    • Day$7.class

    没有创建Day$8.class。也许你之前有 8 个内部类,你编译然后你删除了一个...... 尝试使用文本编辑器打开 .class 文件,您可以从可读字符中了解更多内容... 例如,在我的Day$1.class 中,我可以阅读文本“今天是星期天”

    【讨论】:

    • 它可能依赖于编译器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多