問題タブ [bcel]

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.

0 投票する
3 に答える
60 参照

java - Javaソースにインデックスを付けるだけでなく、コンパイルされたバイトコードからの情報も含めるものはありますか?

大規模なコードベースを検索する必要があり、次のような検索結果を取得したいと思います。

'どのクラスがメソッドX()を呼び出すか'
および
'インターフェイスYの具体的な実装者を教えてください'

Eclipseでできる便利なことですが、残念ながら私には実践されていません。

solrを使用し、BCELなどを使用してセマンティック情報を追加することを考えていましたが、これはすでに存在しているはずですか?

0 投票する
1 に答える
460 参照

java - Java BCEL からの (バイトコードからの) 文字列は、Javap や他のツールとは異なります

BCEL ライブラリを使用して、特定のメソッドからバイトコードを抽出します。そのために、BCEL Method クラスの getCode() 関数を使用します。

私がする時:

lcd オペコードを見ると、次のようになります。

悪いエンコーディング

しかし、私はそれが欲しいです(lcdオペコード用):

ここに画像の説明を入力

JavaP を使用して逆コンパイルすると、結果は 2 番目の図のようになります。

問題はエンコーディングにあります。これは UTF-8 である必要があると思います。エンコーディングを変更する方法を他のトピックで調べていますが、これが問題であるかどうかはわかりません。

BCEL を使用して適切な文字列エンコーディングを行うにはどうすればよいですか?

編集:

最初の画像は Java コンソールからのものです。2番目の写真はdirtyJOE v1.5のものです

0 投票する
2 に答える
702 参照

java - クラスファイル定数プールに欠落しているクラス

私はバイトコード分析を使用して、クラスファイルのすべてのインポートされたクラスを取得しています(BCELを使用)。ここで、定数プールを読み取ると、インポートされたすべてのクラスがCONSTANT_Class(仕様を参照)として表示されるのではなく、CONSTANT_Utf8としてのみ表示されます。今の私の質問:インポートされたファイルを読み取るために、定数プールのCONSTANT_Class-entriesだけに依存することはできませんか?クラス名かどうか、本当にすべてのエントリを見て推測する必要がありますか?これもすべての状況で正しいとは限りません。または、バイトコード全体を読み取る必要がありますか?よろしく

0 投票する
2 に答える
410 参照

jsf - マネージドBean呼び出しへのtaglib呼び出し

私は次のようなマネージドBean(セッションスコープ)を持っています:

私はこれを呼ぶのが好きです

私が知っているのは、 a および b パラメータを使用することはできません。

わかりました: これは、例では、taglib を使用してこれを呼び出す「静的」な可能性である必要があります。

動的に呼び出すのはどうですか?bcel または URLClassLoader を使用していますか?

0 投票する
5 に答える
1710 参照

java - バイト配列(生データ)をJavaクラスファイルに保存することは可能ですか?

私はApacheBCELを使用して、それぞれが独自の関連付けられたイメージを持つJavaクラスを動的に作成しています。これらの生成されたクラスは、次のインターフェイスを実装します。

'getImage'メソッドを動的に実装する場合、メソッドが呼び出されたときにバイト配列を作成/返すためのバイトコードを生成できますが、可能であれば、バイト配列への参照を返すだけです。Javaクラスファイル内に生データを保存することは可能ですか?

0 投票する
2 に答える
1314 参照

java - JVMに挿入する前にJavaバイトコードを検証する方法は?

「オンザフライ」で生成されたバイトコードを検証しようとしています。

私はすでにいくつかの試みをしました。1つの試みはEclipseコンパイラを使用して実行時にクラスをコンパイルすることであり、もう1つはここで説明するようにメモリからコンパイルすることでした。

メモリからコンパイル

最初の結果は問題ないように見えましたが、JAVA 6のガイドラインとセキュリティ測定、および通常のOOPモデルに従って、検証プロセスが本当に有効かどうかはまだ100%わかりません。

バイトコードを検証するためのより良い方法はありますか?

0 投票する
0 に答える
226 参照

java - OSS プロジェクトがパッチをリリースするまでライブラリにパッチを適用するモンキー

私のコードでは確立されたオープン ソース ライブラリを使用していますが、バグを発見し、コミュニティに報告しました。ただし、コードを変更することによるすべての副作用を知っているわけではないため、バグを修正する資格はありません。バグは、最終クラスのプライベート関数にあります。フレームワークは、そのクラスの既にインスタンス化されたバージョンを関数に渡しました。必要な期間、そのクラスのインスタンスを修正するために使用できる適切な Monkey パッチ技術があるかどうか疑問に思っています。これにより、潜在的な望ましくない副作用が制限されます。アスペクト指向プログラミング、バイトコード操作、リフレクションなどのテクニックがあることを理解しています。この状況で私は何をすべきですか?

ご提案いただきありがとうございます。

0 投票する
2 に答える
510 参照

java - Java バイトコードの任意のシーケンスを抽出して実行する

Java クラス A の .class ファイルが与えられた場合、(たとえば BCEL、ASM などを使用して) 特定のバイトコード シーケンスを抽出し (それが基本ブロックであると仮定)、別の場所に配置し、後で実行する方法はありますか?バイトコードのそのシーケンス?

例: ソース コードには ... a += b; という行があります。b += 21; . .

私はバイトコード表現にしかアクセスできません。これらのバイトコードを抽出して、ブラック ボックスとして扱いたいと考えています。クラス A の指示では、ソース行の代わりに「a += b;」欠落している適切なバイトコード シーケンスを保持するこの外部ブラック ボックス X をポイントする必要があります。スタック フレーム上のすべての必要な変数 (たとえば、a、b の現在の値、おそらくブラック ボックス X で使用されるメソッド パラメーターなど) をブラック ボックスにフィードし、バイトコード シーケンスの実行後に、ブラック ボックスは、新しく更新されたフレーム変数とともに元のクラス A に制御を戻します...

アイデアをありがとう。

編集:

以下に示すように、ブラック ボックスはスタブ クラス ファイル内のスタブ メソッドであることが最も合理的です。問題は、この命令シーケンスからこの整形式のスタブ クラスとメソッドを最も合理的に作成する方法と、元のクラス A から制御を移す方法です。理想的には、これはコンパイル時に「オフライン」で行われます。時間。

0 投票する
2 に答える
7665 参照

java - インストルメンテーションを使用して Java クラスにコードを追加する: ASM または BCEL?

「登録された」イベント ハンドラ クラスのリスナー メソッドを呼び出してイベントをディスパッチするイベント ディスパッチャ クラスを持つゲーム エンジン/ライブラリを作成しています。適切なディスパッチャー メソッドを呼び出すことで、イベント ハンドラー/リスナーをイベント ディスパッチャーに登録できます。

これは明らかに、すべてのイベント ハンドラーを登録するためのボイラープレート コードにつながります (また、私のエンジンの他の側面にも同様のボイラープレート コードがあります)。そのため、コーディング中にイベント ディスパッチャに明示的に登録する必要はありません。プログラムの実行時に、ディスパッチャの register メソッドの呼び出しが自動的に追加されます。

インストルメンテーションを使用するには、何らかのバイトコード修飾子 API を使用する必要があることを理解しています。ASM と BCEL の 2 つを知っています。どちらを使用する必要がありますか? 明らかに、これは私が行おうとしているやや単純なタスクであるため、学習しやすく、より適切に文書化されたタスクが必要です。

編集:これは具体的な例です。

元のイベント ハンドラ クラス:

変換後:

0 投票する
0 に答える
338 参照

java - インストルメンテーションを使用して変数値を取得する方法は?

私は現在、呼び出されたメソッドの名前とメソッドによって渡された値でスタック トレースを取得する Java エージェントを開発しようとしています。さまざまなオブジェクトのいくつかのインスタンスを作成し、それらを使用して Java エージェントをテストする単純なアプリケーションがあります。

ああ、私もBCELを使っています。

今のところ、取得できるのはメソッドと属性を持つすべてのクラスだけです。

Java エージェントのコードは次のとおりです: http://pastebin.com/HFkgswJH

実行すると次のようになります: java -javaagent:instr.jar bookStore.jar : http://pastebin.com/gsjat72E

では、メソッドが呼び出されたときにトレースを取得するにはどうすればよいでしょうか? たとえば、私の単純なアプリケーションで次のことを行うとします。

Book myBook = new Book("タイトル", "著者", "スリラー");

myBook.setTitle("これはおかしい");

メソッド名「setTitle」と渡された文字列値「This is Funny!」を取得したいと思います。

何か案は?リンク?図書館?

ありがとう!