1

オープン ソース ライフサイクル フレームワーク API プロバイダーとして、ライフサイクル API を提供する暗黙の方法で内部設計を非表示にするために最善を尽くしたいと考えています。これにより、API クライアントにより多くの利便性がもたらされます。

コア Java アプリケーションと Java EE アプリケーションの両方の構成を回避することが期待されていますが、現実には、java コマンドの -javaagent:${path}/Lifecycle.jar オプションを使用して、クラスのロード時に独自の ClassFileTransformer を有効にしています。

いくつかの検索の後、いくつかの不明な方向が見つかりました。要約して私たちを導くために、Java Guyが必要です。

  1. エージェントメインとプリメイン
  2. Glassfish の ByteCodePreprocessor などの特定のランタイム環境との統合には、バイト コード変換を実行する次のメソッドがあります。

    public byte[] preprocess(String classname, byte[] classBytes);

これらの方向についての私の混乱:

  1. Core Java Application の場合、startup クラスの main メソッドを変更して、agentmain ソリューションを適応させることができるようです。他のオプションはありますか?
  2. Glassfish などの JavaEE Con​​tainer を使用する場合、ByteCodePreprocessor を使用してクラスのバイト コードを変更できますが、いくつかの新しいクラスを作成する必要がありますが、それらの新しいクラス ファイルをどこに保存するか、または新しいクラス ファイルを設計または適用する方法がわかりません。 ClassLoader を使用して、クラス ファイルの前処理中に新しく作成されたクラス ファイルをロードします。

(ところで、Lifecycle API は、EntityManager インターフェースを持たない JPA に非常に近いメタ駆動型スタイルに従います。現在のところ、それらのほとんどは単なる Annotations と CallbackContext インターフェースと LifecycleEvent インターフェースです。)

4

1 に答える 1

2

私が考えることができる唯一の他の方法は、実行時に登録できるカスタム クラス ローダーを使用することです。これが、Powermockのようなフレームワークが重労働を行う方法です。ただし、これにはセットアップも必要ですが、プログラムで実行できます。

フレームワークに適切に定義されたエントリ ポイントがあり、すべてのコードがアプリケーション内から実行される限り、ロードされたすべてのクラスを計測できるカスタム クラス ローダーを適用できます。

ただし、これはすでにロードされているクラスには機能しません。(親の最初のパターンを壊すことはできますがClassCastException、フレームワークの外側からのインスタンスで s が発生する可能性があります。)

これを回避するには、同様に冗長なシステム クラス ローダーをオーバーライドする必要があります。完全を期すために、次の javadoc の抜粋を示しClassLoader.getSystemClassLoaderます。

このメソッドが最初に呼び出されたときにシステム プロパティ「java.system.class.loader」が定義されている場合、そのプロパティの値は、システム クラス ローダーとして返されるクラスの名前と見なされます。クラスは、デフォルトのシステム クラス ローダーを使用してロードされ、委譲の親として使用される ClassLoader 型の 1 つのパラメーターを受け取るパブリック コンストラクターを定義する必要があります。次に、このコンストラクターを使用して、既定のシステム クラス ローダーをパラメーターとしてインスタンスが作成されます。結果のクラス・ローダーは、システム・クラス・ローダーとして定義されます。

このカスタム クラス ローダーでは、インストルメント化されたクラスを常に返すことができます。

違いはagentmainpremain、実行中の JVM に ( attach API を介して) エージェントをアタッチすると前者が呼び出され、JVM の起動時にコマンド ラインでエージェントが指定された場合に後者が呼び出されることです。実行時にエージェントを登録することは、実際には解決策になる場合があります。私がリンクしたブログエントリは、それについて非常によく説明しています。

于 2013-11-28T12:36:51.200 に答える