2016-05-09 9 views
0

私は最近、「バイトコード操作」という言葉に出会った(これを調べるために、Hibernateを使ったアプリケーションでログを見てバイトコードプロバイダを見たのは間違いない)。私はJava Reflection APIについても知っています。Javaバイトコード操作とJavaリフレクションAPI?

これらの2つの概念は似ていますか?それらの違いは何ですか?どちらを使うの?

答えて

3

Reflection APIを使用すると、すでにJVMにロードされているクラスのメンバー(フィールド、メソッド、インターフェイス、e.t.c.)に関する情報にアクセスできます。このAPIでは、プライベートメソッドを呼び出すようないくつかの基本的なことを除いて、クラスの動作を変更することはできません。リフレクションAPIが

  • 適用

    いくつかの例には、依存性注入フレームワークは、所有者オブジェクトのプライベートフィールドに依存関係を設定することができます。

  • すべてのフィールドを列挙したり、新しいフィールドを追加したり既存のフィールドを削除したりすることなく、リフレクションを使用してクラスのequals/hashCode/toStringメソッドを生成できます。
  • クラスをJSON/XML/Yamlまたは他のフォーマットを使用することができます。

逆にByteCode操作を行うと、ディスク上のいくつかの.classファイルや、 JavaエージェントAPIを使用してJVMに既にロードされている

A

  • Java標準ライブラリのプロキシはプロキシインターフェイスのみをサポートしています。バイトコード操作は、ユニットテストは、プライベート静的メソッドの戻り値をsubstitueすることを可能にするためにあなたにもクラスメソッドの周り
  • モックフレームワークをアドバイスを追加することができます - それは時間がコード
  • を記録し、各メソッドをラップバイトコード操作に
  • プロファイラを使用して実装されていますここで

は、それはあなたの詳細な情報について

private void foo() { 
    long start = System.currentTimeMillis(); // inserted by bytecode manipulation 
    Profiler.enterMethod("foo"); // inserted by bytecode manipulation 
    try { // inserted by bytecode manipulation 
     // original method code 
    } finally { // inserted by bytecode manipulation 
     Profiler.exitMethod("foo", System.currentTimeMillis() - start); // inserted by bytecode manipulation 
    } // inserted by bytecode manipulation 
} 
+0

本当にありがとうございましたがどのように見えるかです。 – CuriousMind