質問

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

役に立ちましたか?

解決

これは従来のモンキー パッチ適用よりも少し低レベルで、読んだところによると、VM にすでにロードされているクラスは更新されません。クラス ファイルへの再保存のみがサポートされ、実行時クラスの変更はサポートされません。

他のヒント

BCEL の FAQ より:

質問:BCELでクラスを動的に作成または変更できますか?

答え:BCELには、UTILパッケージ、つまりクラスローダーとjavawrapperに有用なクラスが含まれています。プロキシクリートの例を見てください。

しかし、モンキーパッチというのは…うーん...物議を醸しているため、言語がサポートしていない場合はおそらく使用しないでください。

良い使用例がある場合は、Jython を埋め込むことをお勧めできますか?

あなたはそれをモンキーパッチングと見るかもしれません。私はそれを使用しないことを好みます (おそらく、これを使用する適切な使用例に直面したことがないでしょうか?) が、それに精通しています (Spring と Hibenrate がどのように使用するか、およびその理由を理解するため)。

この実際の例を参照してください。 Jawk - コンパイラ モジュール. 。BCEL はカスタム言語の「コンパイル」に役立ちます。

BCEL はモンキー パッチをサポートしていません。バイトコードで操作するだけで、場合によってはカスタム クラスローダーにロードします。しかし、あなたは JVM上にモンキーパッチを実装できる BCELなどのライブラリとJavaエージェントを使用します。Java エージェント (-javaagent 引数によってロードされる) は、インストルメンテーション API にアクセスし、ロードされたクラスを変更できます。いくつかのブリッジを介して実装することは難しくありません。

でも覚えておいて:

  • -javaagent を使用する必要があるかどうかはわかりません。
  • どの言語でも、モンキーパッチを適用すると、予測不可能な動作が発生する可能性があります。
  • メソッドを変更できます。理論的には、何らかのメソッドを追加することもできますが、変更された (パッチ適用された) クラスに対してプロジェクトをコンパイルする必要があります。これはかなりの痛みを引き起こすだろうし、それだけの価値はないと思います。それをサポートする代替言語があります (例:Groovy) または同様のものをサポートします (例:Scala の暗黙的な変換)。
  • モンキー パッチを使用するよりも、API を適切に設計する方が良いでしょう。サードパーティのライブラリにとってはむしろ便利かもしれません。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top