問題タブ [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 投票する
5 に答える
1125 参照

java - BCEL == javaのモンキーパッチですか?

先日、同僚がBCELを教えてくれました。これは、彼の説明と簡単な説明からわかるように、実行時にバイトコードを変更する方法です。私の最初の考えはそれが危険に聞こえるということでした、そして私の2番目の考えはそれがクールに聞こえるということでした。それから私はそれをもう少し考えて、モンキーパッチに関するコーディングホラーの投稿を思い出し、これが基本的に同じことであることに気づきました。誰かが実用的な何かのためにBCELを使用したことがありますか?これは基本的に実行時のモンキーパッチであるというのは正しいですか、それとも何かが足りないのでしょうか?

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

java - 任意の .class ファイルから BCEL JavaClass オブジェクトを作成する

私はBCELで遊んでいます。私はバイトコードを生成するためにそれを使用していませんが、代わりに既存のコンパイル済みクラスの構造を検査しようとしています。

ハード ドライブの任意の場所にある任意の .class ファイルをポイントし、それに基づいてJavaClassオブジェクトをロードできる必要があります。理想的には、指定されたクラスをクラスパスに追加する必要はありません。

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

bcel - bcel の静的初期化子

BCEL で、クラスの静的初期化子で静的フィールドを初期化したいと考えています。私はそうする方法を見つけていません...ヒントはありますか?

次のようなものが必要です:

ただし、次のようMethodGenなものを(で)生成できるようです:

もちろん、これは同じではありません。

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

java - Ant loadproperties が失敗しました (bcel エラー?)

Java クラス ファイルからいくつかの定数を取得し、それらをファイル名のバージョン番号として使用する単純なビルド スクリプトに取り組んでいます。私は Eclipse と独自の Ant を使用していますが、bcel-5.2.jarを libs フォルダーと Ant 呼び出しのクラスパスに入れています。

しかし残念なことに、ant タスクのloadpropertiesは失敗します。

その後、次のコマンドラインを使用して、Eclipse の外部から Ant を実行しようとしました。

結果は

私は今本当に迷っています。bcelエラーですか?自分の bcel との Ant の非互換性ですか?

最後のヒント: Ant ターゲットから bcel クラスパス エントリを削除すると、次のようになります。

UPDATE EclipseでAnt設定を設定した後、エラーメッセージが変更されました:

Ant と BCEL のバージョンが競合している可能性があります。または BCEL および JDK1.6。それとも Eclipse と BCEL と Ant か JDK か... 迷っています。


答え:

これは以下のコメントです

これについて言及する必要がありました-何も変換する必要はありません。Doc: 「Ant 1.7 以降、文字エンコーディング ISO-8859-1 が文字からバイトへの変換に使用されるため、Java クラス ファイルを読み取るためにこのエンコーディングを使用する必要があります。」これは、生のバイトに対して文字フィルターが使用されているという事実を回避するための慣例にすぎません。ant.apache.org/manual/CoreTypes/… UTF-8 を使うのはまずいでしょう! – マクダウェル

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

java - Javaの行番号からメソッド名を割り出す?

行番号、コード ファイル、および必要に応じてコンパイルされたクラス ファイルが与えられた場合、周囲のメソッドの署名を取得する最も洗練された方法は何ですか (行番号がメソッド内にある場合)。

注意事項:

  • その行はメソッド内にさえないかもしれません
  • 行は、内部クラスまたは匿名クラスのメソッドにある可能性があります

グーグル中にこの重複した質問を発見したので、これを自分で閉じています。

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

java - バイトコード: LOOKUPSWITCH および TABLESWITCH

現在、BCEL を使用してバイトコードを計測しています。BCEL API では、2 つの命令タイプLOOKUPSWITCHTABLESWITCH( package org.apache.bcel.generic) が interface を実装していますStackProducer。これらの 2 つの命令はオペランド スタックをポップ (つまり、それを消費) し、スタック上に何も生成しないことを知っていStackProducerますStackConsumer。これはバグですか?ありがとうございました

(ps: この質問を BCEL メーリング リストに投稿しようとしましたが、回答がありませんでした。ここでもっと幸運が訪れることを願っています)

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

java - クラスローダーを変更する

実行時にクラスローダーを切り替えようとしています。

と:

InjectingClassLoaderは、 org.apache.bcel.util.ClassLoaderを拡張するクラスであり、クラスの親に要求する前に、変更されたバージョンのクラスをロードする必要があります)

「アプローチ1」と「アプローチ2」の結果をまったく同じにしたいのですが、thread.setContextClassLoader(classLoader)は何も行わず、「アプローチ2」は常にシステムクラスローダーを使用しているようです(比較することで判断できます)。デバッグ中のtclおよびccl変数)。

新しいスレッドによってロードされたすべてのクラスに、指定されたクラスローダーを使用させることは可能ですか?

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

java - スタック操作で奇妙なエラーが発生する

JIST/SWANS というツールを使用して実行しているシミュレーションの一部として、奇妙なエラーが発生します。このシミュレーターは Java 1.4 用に作成されており、1.5 に移植しようとしています。

私がやろうとしているのは、元のコードを 1.5 SDK でコンパイルすることです。問題は、シミュレーターがbcelを使用してバイトコードを書き換え、JVM をシミュレーションに使用できるようにすることです。新しい SDK でコードをコンパイルすると、以下のエラーが発生します。誰かがこれを修正するために正しい方向に私を向けることができますか? 1.4 と 1.5 で生成されるバイト コードが多少異なることはわかっていますが、どこから調べればよいかわかりません。

更新: 例外がスローされている場所からこの行に絞り込みました:

この関数に渡されているクラスにメソッドがあるmainため、なぜそれが を返すのかわかりませんnull

更新 2:

1 つの機能があります。

上記のメソッドMyClient.classで this を利用する関数にを渡します。デバッガーを使用すると、明らかに呼び出しが停止しているfindMainことがわかります。クラスは、次の方法で内部静的クラスとして定義されます。declaredMethodsnullgetDeclaredMethodsMyClient

declaredMethodsこれが存在することと関係があるかどうかはわからないnullので、クラスを別のクラスに抽出しようとしましたが、うまくいきませんでした。

更新 3:

わかりました。以下は、メイン クラスでも例外をスローします。

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

java - 動的バイトコード実行

わかりましたので、一般的な文字列の難読化解除ツールを作成しようとしています (単純なアセンブリ エクスプローラーで .NET が持っているものと同様です)

私がやりたいことは、BCEL を介してメソッドの命令を取得し、提供する引数を使用してそれらを実行し、そのメソッドの出力にアクセスすることです。既存のライブラリでこれを行うことは可能ですか? もしそうなら、私は助けを得ることができますか?

ありがとう