3

というプログラムがありMyProgram.javaます。別のマシンで実行される別のディレクトリから実行したい。そこで、ディレクトリをMyProgram.class作成してファイルをコピーし、.batそれを実行するファイル ( Run.bat) を作成しました。これにはコマンドが含まれています: @java MyProgram.

これは機能しませんでした。機能させるためには、SPVerification$1.class生成されたものをコピーするEclipse必要がありました。

このファイルとは何ですか?また、アプリケーションを実行するためにファイルのXXX$1.class横にそれらが必要なのはなぜですか?XXX.class

4

2 に答える 2

12

.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
于 2013-01-17T09:19:55.810 に答える
5

それらは匿名の内部クラスです。言い換えれば、あなたが次のような作品を持っているとき

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ます。

于 2013-01-17T09:21:26.550 に答える