我有一个名为MyProgram.java
. 我想从将在另一台机器上运行的不同目录运行它。所以我创建了一个目录并复制MyProgram.class
了文件并创建了一个.bat
运行它的文件(Run.bat
),其中包括命令:@java MyProgram
.
这不起作用,我必须复制SPVerification$1.class
生成Eclipse
的内容才能使其正常工作。
这是什么XXX$1.class
文件,为什么我需要在XXX.class
文件旁边使用它们才能运行应用程序?
如果您的 .java 文件具有内部/嵌套类,则编译后这些类将由 java 编译器生成为 Yourclass$xxx.class 文件。
内部类定义产生额外的类文件。这些类文件的名称结合了内部和外部类名称,例如 MyClass$MyInnerClass.class。-来源
示例 (编辑)
考虑以下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
它们是匿名的内部类。换句话说,当你有一个像
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
酌情使用。