問題タブ [javap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - javap は、objdump -S のようなバイトコードと混ざり合った元のソース コード行を表示できますか?
次のようにコンパイルすると、このデバッグ情報が .class ファイルに含まれることがわかります。
LineNumberTable:
次のセクションから手動で確認できます。
私が欲しいのはjavap
、バイトコードの途中でソースを表示することです。
サンプル入力:
実際のjavap
出力:
望ましい javap 出力:
これにより、出力の解釈がはるかに簡単になりjavap
ます。
似ていますが、より一般的な質問: javap を使用して、Java コードの行に対応するバイトコードの行を確認する方法は?
私はしようとしました:
- http://bugreport.java.com/submit_intro.doで機能リクエストを作成します。
- メーリング リストに電子メールを送信します。
jdk9-dev@openjdk.java.net
しかし、返信はなく、私のメッセージはそれらの Web サイトにも表示されません。あまりオープンなプロジェクトではありません。
java - javap -c -v -l -s HelloWorld.class に LocalVariableTable が表示されない
Javaバイトコードを理解しようとしています。コマンド を使用して、単純な HelloWorld のプロファイルを作成しますjavap -c -v -l -s HelloWorld.class
。しかし、LocalVariableTable エントリが表示されません。何故ですか?無視されているのでしょうか? OS X 10.10.4 で Java 1.8.0_45 を実行しています。私はあなたの助けに感謝します、ありがとう!
結果:
java - 逆アセンブルされた Java バイトコードによって生成されたニーモニックのメタデータを読み取る方法は?
私はこれまで Javap を使用したことがありません。この例で「コード」が何を意味するのか誰か説明できますか? それはスリータイムに現れます。その下の行に続くニーモニックのコンテキストでは、それはどういう意味ですか? 別のスタック フレームまたは何かがあることを示していますか?:
JVM の仕様を調べたところ、「Code:」を説明するものは何も見つかりませんでしたが、見落としていることが判明した場合は、そのセクションへのリンクを投稿してください。ありがとう。
java - Java: 匿名クラスの初期化とコンストラクター
匿名クラスの処理に直面した奇妙な動作を理解したいと思います。
コンストラクター内で保護されたメソッドを呼び出すクラスがあります (設計が悪いことはわかっていますが、それは別の話です...)
次に、拡張A
およびオーバーライドする別のクラスがありますinit()
。
私がコーディングする場合
私は得る
スーパークラスのコンストラクターはB
ctorの前に呼び出され、その後も呼び出されるため、これは予想されvalue
ます。
しかし、このような匿名クラスを使用する場合
value=0
これは class と多かれ少なかれ等しいはずなので、得られると期待していますB
。コンパイラは、匿名クラスのメソッドで参照されるローカル変数を格納するインスタンス変数をC$1
拡張して作成する新しいクラスを自動的に作成し、クロージャなどをシミュレートします...A
しかし、これを実行すると、
当初、これは私がJava 8を使用していたことが原因であると考えていました.lamdbasを導入したときに、ボンネットの下で匿名クラスが実装される方法が変更された可能性があります(必要なくなりましたfinal
)が、Java 7で試しましたまた、同じ結果を得ました...
実際、 でバイトコードをjavap
見るとB
、
間C$1
:
誰かがこの違いの理由を教えてもらえますか? 「通常の」クラスを使用して匿名クラスの動作を複製する方法はありますか?
EDIT:質問を明確にするために:匿名クラスの初期化が他のクラスの初期化のルールを破るのはなぜですか(他の変数を設定する前にスーパーコンストラクターが呼び出されます)?B
または、スーパー コンストラクターを inovking する前にクラスでインスタンス変数を設定する方法はありますか?
java - javap で逆アセンブルされた Enum にコンストラクターの引数が表示されない
javap で列挙型を逆アセンブルすると、列挙型の暗黙的なコンストラクター引数が欠落しているように見え、その理由がわかりません。
列挙型は次のとおりです。
これを(Java 8u60で)次のコマンドでコンパイルおよび逆アセンブルします。
そして、ここに私が得る出力があります:
私の混乱は、各列挙型定数をインスタンス化するために使用されるプライベートコンストラクターにあります。逆アセンブルは、引数をとらないことを示しています ( private Foo();
) が、確かに引数をとります。たとえばload
、渡された列挙定数の名前と序数、this
およびポインターを読み取り、それらを必要とするスーパークラスのコンストラクターに渡す命令を確認できます。静的イニシャライザ ブロックのコードは、コンストラクタを呼び出す前にこれらの引数をスタックにプッシュすることも示しています。
今、これは javap のあいまいなバグだと思っていたでしょうが、Eclipse のコンパイラでまったく同じ列挙型をコンパイルし、javap を使用してそれを逆アセンブルすると、コンストラクターは引数が表示されていることを除いてまったく同じです。
私の質問は、javac でコンパイルされた列挙型と、javac でコンパイルされた列挙型のコンストラクター引数を javap が表示しない原因となる Eclipse でコンパイルされた列挙型の物理的な違いは何ですか? そして、この違いは (javap、javac、または Eclipse の) バグですか?
java - 可視化された javap ツール
こんにちは 私はこのツールを作成 し、パッケージ名なしで誰でもクラスの情報を検索できる機能を追加しました。私の質問は、各メソッドの情報を追加したいということです。つまり、javadoc html ファイルから情報を取得する必要があるので、すべての html を解析するように言ってください。html 全体を埋め込みたくないので、特定のテキストが必要です。
java - .class ファイルがインターフェイスを実装しているかどうかを調べる
クラス ファイルへのパスが与えられた場合、それが特定のインターフェイスを実装しているかどうかを確認するにはどうすればよいですか?
javap を使用して出力を解析することもできますが、おそらくもっと賢い方法があります。
ソースコードが利用できない可能性があるため、ソースコードを解析したくありません。また、クラス ファイルのパスは実行時にのみ使用できることにも注意してください。