我有一个名为MyProgram.java
的程序。我想从不同的目录运行它,它将在另一台机器上运行。所以我创建了一个目录并复制了MyProgram.class
文件,并创建了一个运行它的.bat
文件(Run.bat
),其中包含命令:@java MyProgram
。
这不起作用,我必须复制SPVerification$1.class
生成的Eclipse
才能使其正常工作。
这个XXX$1.class
文件是什么?为什么我需要在XXX.class
文件旁边使用它们才能运行应用程序?
答案 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文件名中的数字会增加。
请注意,即使使用匿名内部类扩展类而不是实现接口,语法也完全相同。这与创建命名类略有不同,您需要根据需要使用implements
和extends
。