.class文件中的$符号

时间:2013-01-17 09:18:49

标签: java class

我有一个名为MyProgram.java的程序。我想从不同的目录运行它,它将在另一台机器上运行。所以我创建了一个目录并复制了MyProgram.class文件,并创建了一个运行它的.bat文件(Run.bat),其中包含命令:@java MyProgram

这不起作用,我必须复制SPVerification$1.class生成的Eclipse才能使其正常工作。

这个XXX$1.class文件是什么?为什么我需要在XXX.class文件旁边使用它们才能运行应用程序?

2 个答案:

答案 0 :(得分:11)

如果你的.java文件有内部/嵌套类,那么后期编译将由java编译器生成为Yourclass $ xxx.class文件。

  

内部类定义会生成其他类文件。这些课   文件具有组合内部和外部类名称的名称,例如   MyClass的$ MyInnerClass.class。 - Source

示例编辑

考虑遵循Class定义

// MyClass class
public class MyClass{

    // Inner class Test1
    class Inner1 {
    }

    // Inner class Test2
    class Inner2{
    }


    public static void main(String [] args) {

        // Anonymous inner class 1
        new Object() {
        };

        // Anonymous inner class 2
        new Object() {
        };

        System.out.println("Bunch of $ files :)");
    }
}

将生成以下文件

MyClass.class
MyClass$Inner1.class
MyClass$Inner2.class
MyClass$1.class
MyClass$2.class

答案 1 :(得分:4)

他们是匿名的内部类。换句话说,当你有像

这样的作品时
class OuterClass {
    // ...
    void method() {
        Thread t = new Thread(new Runnable() { 
            // ... code implementing Runnable interface ... 
        });
        // ... code to use t or whatever
    }
}

生成匿名内部类,在这种情况下实现Runnable接口,并且该类的已编译代码转到OuterClass$<number>.class文件。您可以拥有多个此类,并且.class文件名中的数字会增加。

请注意,即使使用匿名内部类扩展类而不是实现接口,语法也完全相同。这与创建命名类略有不同,您需要根据需要使用implementsextends