7
class Main {
    public static void main(String[] args) {
        ....
    }
}

シェルを介してプログラムを開始する:java Main期待どおりに機能しますが、antを介してプログラムを開始します:

<target name="run" depends="cmp">
    <java classname="Main" classpath="."/>
</target>`

このエラーが発生します:

java.lang.IllegalAccessException: Class org.apache.tools.ant.taskdefs.ExecuteJava can not access a member of class Main with modifiers "public static"

JLSセクション12.3.3シンボリック参照の解決:

IllegalAccessError:フィールドの使用または割り当て、メソッドの呼び出し、またはクラスのインスタンスの作成を指定するシンボリック参照が検出されました。フィールドまたはメソッドがプライベート、保護、またはデフォルトのアクセス(パブリックではない)として宣言されているか、クラスがパブリックとして宣言されていないため。

したがってorg.apache.tools.ant.taskdefs.ExecuteJava、クラスを囲んでいるのはプライベートであるため、メソッドを実行できませんが、.classを指すjvmをプライベートメソッドで起動すると、同じセキュリティメカニズムを通過しませんか?

この質問は似ていますが、私はまだ理解していません

4

3 に答える 3

10

答えはすべてあなたがリンクした質問にあります。JVMを介して実行すると、アクセスレベルに関係なく、絶対にすべてにアクセスできます。それ自体が別のJavaプログラムであるantを介して実行する場合、他のプログラムと同じルールに従う必要があります。つまり、メインメソッドを認識できません。

クラスを宣言するとpublic class Main、問題は解決するはずです。

jvmが開始時にプライベートクラスへのアクセスを許可するというこの決定を行った理由については、確かに別の問題です。仕様による

12.1.4Test.mainを呼び出す

最後に、クラスTestの初期化が完了した後(他の結果としてロード、リンク、および初期化が発生した可能性があります)、Testのメソッドmainが呼び出されます。メソッドmainは、public、static、およびvoidとして宣言する必要があります。文字列の配列である単一の引数を受け入れる必要があります。このメソッドは、次のいずれかとして宣言できます。

public static void main(String [] args)またはpublic static void main(String ... args)

これは、メソッドが必須であることを具体的に示していますpublicが、質問のクラスについては何も述べていません。そのため、VMを介してmainを直接呼び出すと機能します。

于 2012-08-03T12:28:38.287 に答える
0

次のように、パブリック修飾子をクラスに追加してみてください。

public class Main {
    public static void main(String[] args) {
        ....
    }
}
于 2012-08-03T12:28:38.050 に答える
0

を使用しpublic access-modifierます。

例えば:

public class Main {
    public static void main(String[] args) {
        // Your code..
    }
}
于 2012-08-03T12:37:13.340 に答える