コンパイル済みJavaクラスのコンテンツがバイナリファイル(X.class
)としてあります。適切なmain
メソッドを持つクラスがいくつかあるとしましょうが、元のクラス名はわかりません(それはX
ではありません)。クラス名を知らずにJavaクラスを実行する方法
java
で実行するにはどうすればいいですか?コマンドラインを使用しますか?
コンパイル済みJavaクラスのコンテンツがバイナリファイル(X.class
)としてあります。適切なmain
メソッドを持つクラスがいくつかあるとしましょうが、元のクラス名はわかりません(それはX
ではありません)。クラス名を知らずにJavaクラスを実行する方法
java
で実行するにはどうすればいいですか?コマンドラインを使用しますか?
javap -c <filename>
を使用すると、クラス名を取得できます。 。その時点から、それは単なるシェルゲームです。これは、OS X上で動作します:
java $(javap -c File.class | head -n 2 | tail -n1 | cut -f3 -d\)
注サブシェルで\
後のスペース - これは、クラス名を分離することが必要です。 @のニコライ・vyahhiフィードバックに基づいて
更新:あなたがわからない場合は(それはクラスが公開されているかどうかは不明だときなど) クラス名が表示される位置に、あなたはtr
とgrep
を使用することができます、のようなso:
java $(javap -c File.class | head -n2| tail -n1 | tr [:space:] \\n | grep -A1 "class\|interface" | tail -n1)
あなたはそれを行うためにてjavap使用することができます。
javap X.class
それはクラスを分解し、保護し、パッケージをプリントアウトし、publicフィールドやメソッドになります。
Compiled from "Test.java"
public class Test {
public Test();
public static void main(java.lang.String...);
}
は、その後、あなたがこれを使用することができます
java $(javap X.class | sed -n 's/.*class \(.*\) {/\1/p')
ありがとうございます!私の場合、 'javap'の後の2行目は' class Secret {'であり、' public class Secret {'ではなく' cut -f3 -d \ 'は' Secret'ではなく '{'を与えます。両方のケースを同じ 'cut'引数でサポートできるかどうかは不明です。 –
良い点。ありがとう。私は私の答えを更新しました。 –
ありがとう!しかしそれはまだ 'class Secret {'のためには機能しません - クラス名にドットはありません。また、 'javap -c java.lang.String |ヘッド-n2 |テール-n1 | tr [:space:] \\ n | grep \\。 'は4つの(!)行を出力します。なぜなら、クラスは他のクラスを' implements'や 'extends'することができるからです。 –