4

私は現在、多くの開発者に使用を依頼する API を作成しています。そのほとんどは簡単ですが、本質的に複雑な api 呼び出しがいくつかありますが、ほとんど定型的な方法で使用する必要があります。

私がやりたいことは、おそらくいくつかの注釈をマークすることによって、クラス内の定型コードを生成することですが、それらの生成されたメソッドは、開発者が見ることができるように Eclipse/IntelliJ 内で使用できます。Javassist を見ましたが、ランタイムの性質が良いことかどうかはわかりません。私はむしろコンパイル時のアプローチを望みます。

可能であれば、実装されたコードを非表示にしたいと思います (つまり、再コンパイル時に上書きされるため、生成されたメソッドのコードを開発者に変更させたくありません)。

このすべては、処理の複雑さを開発者やメンテナーから隠し、コア フレームワーク コードだけに留めるために行われます。

4

2 に答える 2

5

この質問には2つの部分があります。まず、ボイラープレートの実装を記述/公開せずに、開発者がAPIを利用できるようにします。次に、ボイラープレートコードの生成を自動化します。

一部のフレームワークが使用されていることを認める場合は、コード/バイトコードを生成せずにこれを行うことができます。

  • 重要な概念ごとに、APIを完全に定義するインターフェースを作成します。
  • 次に、インターフェースを実装しないが、非ボイラープレートAPIのメソッドシグネチャと一致する対応するクラスを記述します。これらをペアにするために、命名規則を使用することをお勧めします。
  • Javaプロキシを使用してインターフェースの実装を生成するファクトリを作成します。プロキシは、可能な限り実装に委任します。ボイラープレートコードは、実装ハンドラーに直接実装されます。
  • さまざまなタイプの呼び出しハンドラーが必要になる場合があります。その場合は、それらの命名規則も検討してください。
  • ロジックとインターフェース間のチェックされていない結合が気に入らない場合は、定型APIを含まないスーパーインターフェースを抽出します。
  • これらの構成を使用するロジックは、インターフェース名でインスタンスを要求します。ファクトリは、基盤となるロジックインスタンスと呼び出しハンドラをインスタンス化する方法を知っています。

一方、開発者にフレームワークの存在を覚えてほしくない場合、またはロジックの内部にアクセスするための定型的な実装が必要な場合は、コード生成/バイトコード操作を行う必要があります。

操作自体は、カスタムクラスローダーを使用して、またはJavaエージェントを使用した初期クラスロード中に実行できます。しかし、どのようにしてAPIを開発者が利用できるようにしますか?ここにいくつかのアイデアがあります:

  • 実装クラスを抽象化し、ボイラープレートコードが生成される抽象メソッドを宣言します。

  • ボイラープレートメソッドのスタブ実装を記述します(つまり、メソッドでは何もせず、他のすべてのvoidメソッドをスローRuntimeExceptionします)。これらのメソッドに注釈を付けます。

  • Google Web Toolkitのようなことをして、定型的なメソッドをとして宣言しnativeます。これはメソッドのマーク付けに似てabstractいますが、クラスの作成などを行うことができますfinal

于 2012-06-26T18:35:24.347 に答える
0

Java コンパイラは、注釈処理をサポートしています。注釈の必要に応じてコードを生成する独自のプロセッサを作成できます。

于 2012-06-26T18:20:37.083 に答える