2016-03-30 12 views
1

コンパイル済みJavaクラスのコンテンツがバイナリファイル(X.class)としてあります。適切なmainメソッドを持つクラスがいくつかあるとしましょうが、元のクラス名はわかりません(それはXではありません)。クラス名を知らずにJavaクラスを実行する方法

javaで実行するにはどうすればいいですか?コマンドラインを使用しますか?

答えて

2

javap -c <filename>を使用すると、クラス名を取得できます。 。その時点から、それは単なるシェルゲームです。これは、OS X上で動作します:

java $(javap -c File.class | head -n 2 | tail -n1 | cut -f3 -d\) 

注サブシェルで\後のスペース - これは、クラス名を分離することが必要です。 @のニコライ・vyahhiフィードバックに基づいて

更新:あなたがわからない場合は(それはクラスが公開されているかどうかは不明だときなど) クラス名が表示される位置に、あなたはtrgrepを使用することができます、のようなso:

java $(javap -c File.class | head -n2| tail -n1 | tr [:space:] \\n | grep -A1 "class\|interface" | tail -n1) 
+0

ありがとうございます!私の場合、 'javap'の後の2行目は' class Secret {'であり、' public class Secret {'ではなく' cut -f3 -d \ 'は' Secret'ではなく '{'を与えます。両方のケースを同じ 'cut'引数でサポートできるかどうかは不明です。 –

+0

良い点。ありがとう。私は私の答えを更新しました。 –

+0

ありがとう!しかしそれはまだ 'class Secret {'のためには機能しません - クラス名にドットはありません。また、 'javap -c java.lang.String |ヘッド-n2 |テール-n1 | tr [:space:] \\ n | grep \\。 'は4つの(!)行を出力します。なぜなら、クラスは他のクラスを' implements'や 'extends'することができるからです。 –

0

あなたはそれを行うためにて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') 
関連する問題